6

从像这样的函数中

function eventHandler(e) {
  // ...
}

是否有可靠有效的方法来确定是否e是 DOM 事件?

4

3 回答 3

3

我不相信有一种可靠的方法可以确定给定对象是否不是DOM 事件。

  1. typeof e将始终返回'object'真正的 Event 对象,这没有帮助。
  2. 您可能在对象上检查的任何属性都可以存在于真正的 Event 对象或任何非 Event 对象中。
  3. 您可能认为原型链可以用于确定这一点,但它与#2 有相同的问题(可以很容易地复制)。
  4. 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因为这些显然很容易被欺骗。

于 2013-01-18T22:13:33.897 回答
0

也许如果事件event.bubbles通过 DOM 冒泡,它就是 DOM 事件。但即使该陈述是正确的,它的传播也可能会停止。

更新

好的,您正在寻找的属性是e.targetIE e.srcElement。这两个属性都返回发生事件的 HTML 元素,该元素将其定义为 DOM 事件。

但是,也许您应该指定您解释为 DOM 事件的内容。你的意思是浏览器的原生事件,因为这也是 DOM 事件:

var zoo = jQuery('#zoo');
zoo.bind('moo');
zoo.trigger('moo');

它绑定到一个 DOM 节点

于 2013-01-18T20:55:00.403 回答
-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));

前一个警报显示为假,而后者显示为真。见小提琴

更新:调用诸如 preventDefault 之类的东西而不是触发器更安全。

于 2013-01-18T21:12:25.433 回答