Skip to content

关于查询宿主环境是否支持某个特定的事件能力的提案讨论 #241

@answershuto

Description

@answershuto

Hi All,

这个 issue 抛出一个关于事件的提案,我希望能够在 Web 中文兴趣组内先进行一些讨论,收集意见和建议,最终目标是能够贡献此标准。

需要注意的是这个文档目前还只是一个"提议",还不算是比较完整的提案。

提案期望解决 Web 标准下具有根据“特征判断”来获取当前宿主环境本身是否提供某个事件能力,以此来得知是否可以在当前宿主环境下使用某个具体的事件能力。

举个例子:

dblclick 事件为例,在移动端上,safari、firefox 等浏览器支持,但是 chrome、android WebView 不支持,这时如果我们没有“特征判断”则需要像下述那样编码。

if (/Chrome/.test(window.navigator.userAgent)) {
  // 通过其他手段实现,比如判断 2 次点击
} else {
  element.addEventListener('dblclick', (e)=>{
    //...
  });
}

显然,通过“环境判断”我们可以去实现相关功能,但是当历史版本以及浏览器种类繁多带来了非常多的判断条件。

Web 标准中,所有的 element 都是继承自 eventTarget,开发者无论监听何种事件都应该正常监听。但是开发者本意是监听一个来自宿主环境的 dispatch 时,宿主环境本身没有相关功能,就会导致功能缺失,而开发者无法很好地在上层进行判断。

我们期望通过“特征判断”来判断是否当前宿主环境提供某个特定事件,以解决上述问题。

我暂时想了三种方案,希望抛出来大家讨论一下:

  1. 通过提供一个宿主环境的方法 navigator.queryEventTypeSupport(type) 以供开发者查询宿主环境是否支持该功能。
const isSupportDblclick = navigator.queryEventTypeSupport('dblclick');
  1. 通过提供一个宿主环境的方法 Event 上提供一个静态方法 queryEventTypeSupport(type) 以供开发者查询宿主环境是否支持该功能。
const isSupportDblclick = Event.queryEventTypeSupport('dblclick');
  1. 在 eventTarget 上提供到某个具体的 element 的事件查询能力。
const element = document.createElement('div');
const isSupportDblclick = element.queryEventTypeSupport('dblclick');

我希望讨论的内容

  • 提案的必要性以及推进的可行性
  • 提案的描述
  • 关于实现可行性
  • 提案的流程
  • 具体实现的方法:比如上述抛出的 navigator 扩展或者 Event 静态方法扩展

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions