如何确定Javascript对象是否为事件?

如何确定Javascript对象是否为事件?,javascript,javascript-events,Javascript,Javascript Events,确定Javascript对象是否为事件的最安全方法是什么?最好的做法是探测可能的“未知”对象,以获取您希望找到的属性和方法 因此,假设您有一个事件对象,并在对其进行操作之前对其进行探测,例如 if (event.target) { //looks like we're an event, hide the target var e=$(event.target); e.hide(); } 需要注意的是,我并不是建议您测试“target”以查看它是否是一个事件:您正在测试tar

确定Javascript对象是否为事件的最安全方法是什么?

最好的做法是探测可能的“未知”对象,以获取您希望找到的属性和方法

因此,假设您有一个事件对象,并在对其进行操作之前对其进行探测,例如

if (event.target)
{
   //looks like we're an event, hide the target
   var e=$(event.target);
   e.hide();
}
需要注意的是,我并不是建议您测试“target”以查看它是否是一个事件:您正在测试target,因为您将要使用该属性。我想说的是,与其试图找出一个对象是否是事件,不如探测该对象,看看它是否会以您期望的方式运行,然后使用这些行为。

这样的代码应该在具有不同支持的浏览器上优雅地降级,或者让您利用特定于浏览器的扩展,例如

if (event.initKeyEvent)
{
    //gecko 1.9+
    event.initKeyEvent(...)
}

我不知道是否有一个可靠的方法来做到这一点,但我认为你最好的办法是鸭子打字


无论如何,根据具体情况,您可以检查给定对象是否具有您想要使用的预期属性,就像前面指出的那样。

此isEvent函数检查未知对象的构造函数,将其转换为字符串,然后搜索已知事件类型:

function isEvent(o){
    //grab the constructor for the unknown object
    var c=o.constructor;
    //convert constructor to string
    var s=c.toString(); 
    /* declare IE RegExp pattern to match for 'object [Event]' */
    if(document.all){
        //set regExp pattern for IE
        var ptr=/\[object Event\]/;     
    }else{
        /* declare FIREFOX regExp pattern to match for 'object [*Event]' since it has
           several event types:
        UIEvent 
        KeyboardEvent
        MouseEvent
        FocusEvent
        WheelEvent
        CompositionEvent
        StorageEvent
        CustomEvent (Requires Gecko 6.0)
        MutationEvent

        Both Custom and Mutation events are not recognized prior to Gecko 6.0,
        so if you want to use these, adjust regExp accordingly */
        var ptr=/\[object (Keyboard|Mouse|Focus|Wheel|Composition|Storage)Event\]/; 
    }   
return ptr.test(s);  }

我也有同样的担心。所以我开始证明,我离解决方案越来越近了

function isEvent(a){
    var txt, es=false;
    txt = Object.prototype.toString.call(a).split('').reverse().join('');
    es = (txt.indexOf("]tnevE") == 0)? true: false; // Firefox, Opera, Safari, Chrome
    if(!es){
        txt = a.constructor.toString().split('').reverse().join('');
        es = (txt.indexOf("]tnevE") == 0)? true: false; // MSIE
    }
    return es;
}
我在中测试了这个特性

  • Ubuntu 11.64上的FF和Opera 12.0
  • 葡萄酒Ubuntu上的Safari 5.0
  • G.WinXP上的Chrome 19和MSIE 8

我希望这能有所帮助。

老问题,但显然根据这一点,
事件。类型是跨浏览器:

RameshVel在其答案的编辑中添加了这一点,但遭到严重否决

当然,最安全的方法是遵循公认答案的指导,但碰巧我想丢弃事件对象。

如何使用?只要事件对象是使用构造函数
new event()
创建的,例如:

var e = new Event('click');
e instanceof Event; // true
对于事件处理程序中的事件参数,尽管其类型为Object,但它包含本机事件作为属性,因此可以使用此属性:

function myEventHandler(e) {
   e.originalEvent instanceof Event; //true
}

此处应注意,实际值可能因浏览器而异,特别是当事件为触摸事件时,请参阅和中的参考。在我的例子中不是问题。

您可以检查对象是否具有属性originalEvent

event.hasOwnProperty('originalEvent')
e、 g:


同样,事件示例在IE中不起作用,IE有一个srcElement属性而不是target。您误解了-您没有测试“target”以查看它是否是一个事件,您正在测试target,因为您将要使用该属性。我想说的是,与其试图找出一个对象是否是事件,不如探测该对象,看看它是否会以您期望的方式运行,然后使用这些行为。这很公平。我不认为它真的回答了最初的问题,但是我不明白为什么你需要测试一个对象是否是一个事件。现在有一个有趣的想法。。。我只需要事件对象的三个属性(如果它真的是一个对象),所以我只需要检查它是否具有所有三个属性,并确保它们的类型是我需要的类型。如果用户愚蠢到发送给我一个带有可用值的假对象,那完全是她的错。谢谢我必须指出,我提出这个问题的原因与此相反,我想确保一个对象不是一个事件。接受Paul Dixon的建议仍然是可能的,只需检查对象是否符合您的期望。if($(object.is('div')){do stuff…}。这将确保元素不是事件对象。@Tim Down:因为我需要区分随机JS对象、HTML元素和作为参数发送到函数的事件。OriginaleEvent是jQuery的东西,对吗?这是值得注意的。这种抽象正是我过去喜欢jQuery的原因。
// var event
var
  isObject = typeof event  ==='object', // is the given argument an object
  isEvent  = isObject ? event.hasOwnProperty('originalEvent') : false; 
if(isEvent) {
  // var `event` is an event!
} else {
  // var event is NOT an event!
}