获取当前环境可用的事件类型
Get the event types available in the current environment
我正在构建一个函数,我发现在其中确定字符串是否用于指定事件类型很有用。 (例如,click
、keypress
、blur
..)目前,我正在将它与我从标准中获取的一组名称进行比较,但我不喜欢这个解决方案几个原因:
真丑。一个包含 167 个项目的硬编码数组看起来非常不优雅。
不同的浏览器环境可能支持不同的事件。我 可以 每个浏览器使用不同的(或额外的)列表,但这只会加剧先前的问题,并且维护起来会很糟糕。
我相信,在某些情况下可以动态创建事件。我不可能事先检测到这些。
我的搜索功能似乎在这一点上让我失望了,所以我求助于 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 中似乎没问题。您应该尽可能地测试版本。
我正在构建一个函数,我发现在其中确定字符串是否用于指定事件类型很有用。 (例如,click
、keypress
、blur
..)目前,我正在将它与我从标准中获取的一组名称进行比较,但我不喜欢这个解决方案几个原因:
真丑。一个包含 167 个项目的硬编码数组看起来非常不优雅。
不同的浏览器环境可能支持不同的事件。我 可以 每个浏览器使用不同的(或额外的)列表,但这只会加剧先前的问题,并且维护起来会很糟糕。
我相信,在某些情况下可以动态创建事件。我不可能事先检测到这些。
我的搜索功能似乎在这一点上让我失望了,所以我求助于 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 中似乎没问题。您应该尽可能地测试版本。