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

时间:2009-09-22 08:55:10

标签: javascript javascript-events

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

7 个答案:

答案 0 :(得分:43)

对于您希望找到的属性和方法探测可能的“未知”对象是相当不错的做法。

因此,假设你拥有得到一个事件对象,并在对其采取行动之前对其进行探测,例如

if (event.target)
{
   //looks like we're an event, hide the target
   var e=$(event.target);
   e.hide();
}

重要的是要注意,我并不建议你测试'目标'以查看它是否是一个事件:你正在测试目标,因为你将要使用该属性。我正在推动的是,不是试图弄清楚对象是否是事件,而是探测对象以查看它是否会以您期望的方式运行,然后使用这些行为。 < / p>

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

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

答案 1 :(得分:30)

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

var e = new Event('click');
e instanceof Event; // true

如果事件处理程序中有event参数,虽然它的类型是Object,但它包含本机事件作为属性,因此可以使用它:

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

这里应该注意,实际值可能会因浏览器而异,特别是当事件是触摸事件时,请参阅here和其中的引用。在我的情况下不是问题。

答案 2 :(得分:4)

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

event.hasOwnProperty('originalEvent')

例如:

// 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!
}

答案 3 :(得分:3)

这个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);  }

答案 4 :(得分:2)

老问题,但显然根据这一点,event.type是跨浏览器:

http://www.quirksmode.org/js/events_properties.html

RameshVel在他的回答的编辑中添加了这个,但它被大幅下调。

当然,最安全的方法是遵循接受的答案的指导,但恰好如果它是一个事件,我想丢弃该对象。

答案 5 :(得分:0)

我不知道是否有一种确定的方法可以做到这一点,但我认为你最好的选择是打字。

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

答案 6 :(得分:0)

我有同样的担忧。所以我开始证明,我更接近解决方案。

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
  • Wine-Ubuntu上的Safari 5.0
  • G.Chrome 19和MSIE 8 on WinXP

我希望这会有所帮助。