获取当前环境可用的事件类型

Get the event types available in the current environment

我正在构建一个函数,我发现在其中确定字符串是否用于指定事件类型很有用。 (例如,clickkeypressblur..)目前,我正在将它与我从标准中获取的一组名称进行比较,但我不喜欢这个解决方案几个原因:

我的搜索功能似乎在这一点上让我失望了,所以我求助于 Stack Overflow 的聪明和慷慨的用户。简而言之,我的问题是:

如何在运行时获取当前识别的事件类型的列表?

Object.keys(HTMLElement.prototype).filter(function(k) { return /^on/.test(k); });

这是我的首选 reference,非常全面。

类似于 SLaks 的回答,但您可以 运行 它在 window 对象上而不是获取详尽的事件列表。

Object.keys(window).filter(function(k) { return /^on/.test(k); });

你没有说你为什么要这样做,所以答案只能解决“如何判断一个字符串是否是一个'on'事件[=32=”的具体问题]".

我认为对此没有明确的策略。使用从实现、标准或规范中整理的所有可能事件类型的列表可能相当可靠,但并不完美,因为 javascript 实现可以自由地引入他们希望的任何新类型的事件。因此,该列表需要经常更新,您至少必须在每个新发布的浏览器和版本上测试并可能更新该列表。此外,并非所有浏览器都支持所有事件。

使用诸如收集 DOM 对象或其原​​型的可枚举 "on" 属性之类的策略也不适合,因为主机不需要在 DOM 对象上实现继承,并且有些不使它们可枚举(至少例如 Safari v9)。

另一个解决方案是查看 'on' + string 是否是 DOM 对象的标准 属性,因此:

function isPossibleEventName(s) {
  var div = document.createElement('div');
  return ('on' + s) in div;
}

['click','input','blur','foo','bar','paste'].forEach(function(s){
  document.write('<br>Possible event ' + s + ': ' + isPossibleEventName(s));
});

这至少会告诉您主机是否支持特定的事件类型,但是可能需要在不同的元素类型上进行测试,因为并非所有元素都必须支持所有事件。此外,它不会告诉您字符串是否可能是其他主机中的 "on" 事件(但也不会整理元素原型的 "on" 属性)。

虽然这应该适用于所有浏览器,但 some doubt if the above will work in older Firefox. However, this post 另有说法,在版本 43 中似乎没问题。您应该尽可能地测试版本。