测试对象是否是DOM事件

时间:2013-01-18 20:39:43

标签: javascript javascript-events

来自

之类的功能
function eventHandler(e) {
  // ...
}

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

3 个答案:

答案 0 :(得分:3)

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

  1. typeof e将始终返回'object'作为真正的Event对象,这对您没用。
  2. 您可以在对象上检查的任何属性都可以存在于真正的Event对象或任何非Event对象中。
  3. 您可能认为原型链可用于确定这一点,但它与#2具有相同的问题(可以轻松复制)。
  4. contructor属性似乎很有希望,但可以这样做:
  5. 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而不是触发器更安全。