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

Javascript 获取当前环境中可用的事件类型,javascript,events,dom,javascript-events,Javascript,Events,Dom,Javascript Events,我正在构建一个函数,在这个函数中,我发现确定字符串是否用于指定事件类型很有用。(例如,'click'、'keypress'、'blur'…)目前,我正在将其与从标准中获取的一系列名称进行比较,但出于以下几个原因,我不喜欢此解决方案: 很难看。一个包含167项的硬编码数组似乎非常不雅观 不同的浏览器环境可能支持不同的事件。我可以在每个浏览器中使用不同的(或附加的)列表,但这只会加剧之前的问题,而且维护起来会非常糟糕 我相信,在某些情况下,事件可以动态创建。我不可能事先发现这些 在这一点上,我的

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

  • 很难看。一个包含167项的硬编码数组似乎非常不雅观

  • 不同的浏览器环境可能支持不同的事件。我可以在每个浏览器中使用不同的(或附加的)列表,但这只会加剧之前的问题,而且维护起来会非常糟糕

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

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


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

这是我的目标,非常全面。

与SLaks的答案类似,但您可以在window对象上运行它,以获得详尽的事件列表

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

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

您没有说明为什么要这样做,因此答案只能解决“如何判断字符串是否为“打开”事件”这一特定问题

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

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

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

函数isPossibleEventName{
var div=document.createElement('div');
在div中返回('on'+s);
}
['click'、'input'、'blur'、'foo'、'bar'、'paste']等{
编写(“
可能的事件”+s+”:“+isPossibleEventName(s));
});这就是我目前用来加载数组的,我自己。但我发现这个解决方案不完美,正如问题中所描述的。这很聪明,我喜欢它。但出于某种原因,它在Firefox开发者版中返回的唯一内容是“onwheel”。对于Chrome,它返回11项,缺少几个常见事件,如“onclick”。@JonCarter:对不起;这应该是
HTMLElement
这里的缺陷是它假设主机实现DOM对象的原型继承(这不是必需的),并且所有事件都可以作为HTMLElement.prototype的成员使用(在Safari中尝试)。@JonCarter MDN不是权威,也不是专门针对Safari的(但无论如何,这是一个非常有用的资源)。不确定引用的任何标准和规范是否要求此类属性可枚举。浏览器、标准和规范是一个不断移动的目标。功能测试和回退现在和以往一样重要。没有任何接口需要继承,尽管最近编写的规范可能是为了推断继承为了方便起见。所有东西都是为了定义行为而写的,而不是为了实现。@JonCarter:它们是宿主对象。它们不一定遵循原型。也许不是一个完全的副本,但我认为它有你想要的答案:。这里是我的目标的更完整的描述,而不是我在问题中给出的非常简短的描述:我需要决定什么时候对象键是事件类型或其他类型
。我可以用不同的方法来解决这个问题,但这并不能满足我对这是否可能的好奇——我可以想象,在某种情况下,这可能是不可避免的,而且似乎应该有办法做到这一点。:)我很抱歉一开始不理解这一点。这是一个很好的答案。但请看我对SLakS答案的评论,因为我不知道它是否实质上更好。