来自
之类的功能function eventHandler(e) {
// ...
}
是否有一种可靠而有效的方法来确定e
是否是DOM事件?
答案 0 :(得分:3)
我不相信有一种可靠的方法可以确定某个给定对象是不一个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
上指定属性,因为很明显这些属性很容易被欺骗。
答案 1 :(得分:0)
也许如果事件通过DOM冒泡event.bubbles
它是DOM事件。
但即使这种说法是正确的,它的传播也可能会停止。
更新:
确定您要查找的属性为e.target
,IE为e.srcElement
。
这两个属性都返回事件发生的HTML元素,并将其定义为
DOM事件。
但是,您可能应该指定您将其解释为DOM事件。 你的意思是浏览器的原生事件,因为这也是DOM事件:
var zoo = jQuery('#zoo');
zoo.bind('moo');
zoo.trigger('moo');
绑定到DOM节点
答案 2 :(得分:-1)
在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));
前警报显示为假,而后者显示为真。请参阅fiddle。
更新:调用preventDefault而不是触发器更安全。