Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
answershuto opened this issue Apr 9, 2021 · 12 comments

Comments

@answershuto
Copy link
Member

answershuto commented Apr 9, 2021

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 静态方法扩展
@answershuto answershuto changed the title 关于查询宿主环境是否支持某个特定的事件能力的提案 关于查询宿主环境是否支持某个特定的事件能力的提案讨论 Apr 9, 2021
@wssgcg1213
Copy link

isEventSupports() 会更好一点吧

@zhijs
Copy link

zhijs commented Apr 9, 2021

赞👍~

  1. 确实有必要,日常开发中经常会遇到这种探测判断的场景,比如屏幕横竖屏切换事件,如果有相关的检测方法的话,会更方便以及代码的可读性更高。
  2. 可能在 Event 静态方法上扩展会跟合适一些,毕竟 Event 对象基本在所有的环境中都存在。
  3. 上述的 API 方式都不错,我这里也提供一种供参考的方式const isSupports = Event. supports('dbclick');

@wssgcg1213
Copy link

wssgcg1213 commented Apr 9, 2021

  • 这个问题确实是存在的,对于事件的特征判断目前缺乏有效路径,尽管有一些事件有 InputEvent 这类 Constructor, 但是像 load 这样的 simple event 是没有构造器的
  • 3 个方案我倾向于 1, 事件支持是由 UserAgent(浏览器) 的实现来决定的, 所以这类判断放在 navigator 下会符合逻辑吧~ 其次 Event 也是不错的, 至于是否要区分 UI Event 和其它 Event 可以再讨论看看

@xfq
Copy link
Member

xfq commented Apr 9, 2021

看起来挺有用的,在标准层面感觉和HTML/DOM关系比较大,可以考虑在这个issue里先讨论一下这个提案的使用场景和建议语法,初步成型后提到DOM标准?

这是一个DOM的新特性提案的例子,可供参考(不过这个提案比我们讨论的这个要复杂得多):https://github.com/mfreed7/declarative-shadow-dom/blob/master/README.md

@answershuto
Copy link
Member Author

其实在无论是在 Event 上扩展 还是 navigator 上扩展,都是一个全局的查询能力,只是一个能力归属放在哪个 global 对象下更合适的问题。而对于某些 element 的特定事件,上述 @wssgcg1213 比如 的 InputEvent 能力,属于某个 element 的特定能力,所以如果提供 element 级别的查询,使开发者可以感知某个具体的 element 支持哪些事件。

@answershuto
Copy link
Member Author

考虑到特定元素的一些特有事件,以及 window 上的 onload 事件等,更倾向放在 EventTarget 上提供一个基础能力。继承 EventTarget 的 class 如果有自己的特有事件,可以覆盖该方法提供特有的一些事件判断。

@answershuto
Copy link
Member Author

@xfq 已补充相关提案文档 https://github.com/answershuto/isEventSupports

@xfq
Copy link
Member

xfq commented Apr 12, 2021

谢谢 @answershuto 。简单看了一下你的提案,有两点建议:

  1. 我觉得需要写一下为什么不能使用 if (window.MouseEvent) 或者 if ("onxxxxx" in window) 这样的用法,因为这可能是常见问题
  2. 例子里写的 isEventSupports(Event event); 和下面的 .isEventSupports('click'); 不匹配,可能需要改为 isEventSupports(DOMString eventType);

@answershuto
Copy link
Member Author

感谢 @xfq 的宝贵建议,相关内容我已经修改以及增加在文档中了。

https://github.com/answershuto/isEventSupports#other-considerations

@xfq
Copy link
Member

xfq commented Apr 13, 2021

感谢 @answershuto

如果其他同学没有新的comment,我觉得可以在DOM提一个issue了:https://github.com/whatwg/dom/issues

Issue里可以简单介绍一下这个提案,再加一个到 https://github.com/answershuto/isEventSupports 的链接。

@xfq
Copy link
Member

xfq commented Apr 13, 2021

另外,提案有一个小typo:最后的input will return ture应该是input will return true

@answershuto
Copy link
Member Author

感谢 @xfq ,相关内容已修改。
DOM issue 见 whatwg/dom#968

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants