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

时间:2016-03-28 00:06:43

标签: javascript events dom javascript-events

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

  • 这很难看。一个由167个项目组成的硬编码阵列似乎非常不优雅。

  • 不同的浏览器环境可能支持不同的事件。我可能每个浏览器使用不同的(或附加的)列表,但这只会加剧先前的问题,并且维护是不可思议的。

  • 我相信,有些情况可以动态创建事件。我不可能事先发现这些。

我的搜索似乎在这一点上让我失望了,所以我转向我聪明而慷慨的StackOverflow用户。简而言之,我的问题是:

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

4 个答案:

答案 0 :(得分:1)

Date < 0

答案 1 :(得分:1)

类似于SLaks&#39;回答,但你可以在窗口对象上运行它,而不是获得详尽的事件列表。

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

答案 2 :(得分:1)

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

我认为没有明确的策略。使用从实现,标准或规范整理的所有可能事件类型的列表可能相当可靠但不完美,因为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”属性)。

虽然这应该适用于所有浏览器,但如果上述内容适用于较旧的Firefox,则会some doubt。但是,this post说不然,在版本43中似乎没问题。你应该在你认为合理的情况下测试版本。

答案 3 :(得分:0)

这是我的首选reference,相当全面。