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

什么是最安全的方式来确定一个JavaScript对象是一个事件?

探索可能的“未知”对象是您期望find的属性和方法的相当好的做法。

所以,假设你已经有一个事件对象,并探讨它,然后才行事,例如

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

需要注意的是,我并不是build议您testing“目标”,看看它是否是一个事件:您正在testing目标,因为您即将使用该属性。 我在驾驶的是,不是试图找出一个对象是否是事件,而是探究对象,看看它是否会以你期望的方式行事,然后使用这些行为。

像这样的代码应该在不同的支持浏览器上优雅地退化,或者让你利用浏览器特定的扩展,例如

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

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

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

在事件处理程序中的事件参数的情况下,虽然它的types是Object,但它包含本地事件作为属性,所以可以使用它:

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

这里应该注意的是,实际值可能因浏览器而异,特别是当事件是触摸事件时,请参阅此处及其内的参考。 在我的情况不是一个问题。

这isEvent函数检查未知对象的构造函数,将其转换为string,然后search已知事件types:

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

你可以检查对象是否有一个属性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! } 

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

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

RameshVel在编辑中join了这个答案,但是却被严重低估了。

当然,最安全的方法是遵循已接受答案的指导,但是如果事件发生,我想丢弃这个对象。

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

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

我也有同样的担心。 所以我开始certificate,我更接近解决scheme。

 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; } 

我testing了这个function

  • FF和Opera 12.0在Ubuntu 11.64
  • Wine-Ubuntu上的Safari 5.0
  • G.Chrome 19和WinXP上的MSIE 8

我希望这有帮助。