测试对象是否是DOM事件

Tre*_*ham 6 javascript javascript-events

从像这样的功能

function eventHandler(e) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

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

Shm*_*dty 3

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

  1. typeof e将始终返回'object'真正的事件对象,这没有帮助。
  2. 您可能在对象上检查的任何属性都可以存在于真正的事件对象或任何非事件对象中。
  3. 您可能认为原型链可以用于确定这一点,但它与#2 具有相同的问题(可以轻松复制)。
  4. contructor属性可能看起来很有前途,但可以这样做:
function DummyEvent(){
    this.constructor.toString = function(){
        return "function MouseEvent() { [native code] }";
    }
}
Run Code Online (Sandbox Code Playgroud)

这最终console.log(e.constructor)打印出来"function MouseEvent() { [native code] }"

那么,有没有一种“可靠”的方法来判断一个对象是否是一个事件呢?

编辑- 请注意,如果您想防止事件欺骗,所有这些都是无关紧要的,因为您可以轻松创建真实事件。

var evt = new Event('click');
var evt2 = document.createEvent('MouseEvents');
evt2.initMouseEvent('click', ...);
//etc
Run Code Online (Sandbox Code Playgroud)

Edit2 - 我创建了一个测试jsFiddle试图找到某种方法来区分对象,但我还没有找到任何明确的东西。请注意,我没有费心指定 的属性,DummyEvent因为这些属性显然很容易被欺骗。