从像这样的函数中
function eventHandler(e) {
// ...
}
是否有可靠有效的方法来确定是否e
是 DOM 事件?
从像这样的函数中
function eventHandler(e) {
// ...
}
是否有可靠有效的方法来确定是否e
是 DOM 事件?
我不相信有一种可靠的方法可以确定给定对象是否不是DOM 事件。
typeof e
将始终返回'object'
真正的 Event 对象,这没有帮助。contructor
属性可能看起来很有希望,但可以这样做:function DummyEvent(){
this.constructor.toString = function(){
return "function MouseEvent() { [native code] }";
}
}
这最终会console.log(e.constructor)
打印"function MouseEvent() { [native code] }"
那么,是否有一种“可靠”的方式来判断一个对象是否是一个事件?没有。
编辑- 请注意,如果您想防止事件欺骗,所有这些都无关紧要,因为您可以轻松创建真实事件。
var evt = new Event('click');
var evt2 = document.createEvent('MouseEvents');
evt2.initMouseEvent('click', ...);
//etc
Edit2 — 我创建了一个测试jsFiddle,试图找到一些区分对象的方法,但我还没有找到任何确定的东西。请注意,我没有费心在 上指定属性,DummyEvent
因为这些显然很容易被欺骗。
也许如果事件event.bubbles
通过 DOM 冒泡,它就是 DOM 事件。但即使该陈述是正确的,它的传播也可能会停止。
更新:
好的,您正在寻找的属性是e.target
IE e.srcElement
。这两个属性都返回发生事件的 HTML 元素,该元素将其定义为 DOM 事件。
但是,也许您应该指定您解释为 DOM 事件的内容。你的意思是浏览器的原生事件,因为这也是 DOM 事件:
var zoo = jQuery('#zoo');
zoo.bind('moo');
zoo.trigger('moo');
它绑定到一个 DOM 节点
在 jquery 中,我创建了一个测试函数,如下所示:
function isEvent(e) {
try {
e.PreventDefault();
return true;
}
catch (err) {
return false;
}
}
和测试代码:
var o = new Object();
var e = $.Event('click');
alert(isEvent(o));
alert(isEvent(e));
前一个警报显示为假,而后者显示为真。见小提琴。
更新:调用诸如 preventDefault 之类的东西而不是触发器更安全。