2009-09-22 21 views
36

¿Cuál es la forma más segura de determinar si un objeto JavaScript es un evento?¿Cómo determinar si el objeto Javascript es un evento?

+3

@Tim abajo: Porque necesito para hacer la diferencia entre un objeto JS azar, un elemento HTML y un evento que está siendo enviado como parámetro a la función. – Tom

Respuesta

35

Es una buena práctica sondear objetos posiblemente "desconocidos" para las propiedades y métodos que espera encontrar.

Supongamos que tiene tiene un objeto de evento y lo prueba antes de actuar en él, p.

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

Es importante señalar que no estoy sugiriendo que usted prueba de 'objetivo' para ver si su un evento: se está probando para el objetivo, porque estás a punto de utilizar esa propiedad. Lo que quiero decir es que en lugar de tratar de averiguar si un objeto es un evento, sondee el objeto para ver si se comportará de la manera esperada y luego use esos comportamientos.

Este tipo de código se debe degradar con gracia en los navegadores con soporte diferente, o le permite aprovechar las extensiones específicas del navegador, p.

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

Una vez más, el ejemplo de evento no funcionará en IE, que tiene una propiedad srcElement en lugar de destino. –

+3

Has entendido mal: no estás probando el "objetivo" para ver si se trata de un evento, estás probando el objetivo * porque estás a punto de utilizar esa propiedad *. Lo que estoy conduciendo a decir que en lugar de tratar de averiguar si un objeto es el evento para sondear el objeto para ver si va a * * se comportan de la manera esperada, a continuación, utilizar esos comportamientos. –

+0

Bastante justo. No creo que realmente responda la pregunta original, pero luego no veo por qué alguna vez necesitarías probar si un objeto es un evento de todos modos. –

0

No sé si hay una forma segura de hacer eso, pero creo que es su mejor tiro de pato a escribir.

De todos modos, dependiendo de la situación, puede verificar si un objeto dado tiene las propiedades esperadas que desea usar, al igual que Paul señalado.

3

función Esta isEvent comprueba el constructor del objeto desconocido, la convierte en una cadena, y luego busca que para los tipos de eventos conocidos:

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

tengo la misma preocupación. Así que me puse a probar, y me acerqué a la solución.

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

He probado esta característica en

  • FF y Opera 12.0 en Ubuntu 11.64
  • Safari 5.0 en Wine-Ubuntu
  • G.Chrome 19 y MSIE 8 en WinXP

Espero que esto ayude.

2

vieja pregunta, pero al parecer de acuerdo con esto, es event.type entre navegadores:

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

RameshVel añadió esta en una edición a su respuesta, pero se votó pesadamente.

Por supuesto, la forma más segura es seguir la orientación de la respuesta aceptada, pero sucedió que quiero descartar el objeto si se trata de un evento.

17

¿Qué le parece usar instanceof?Siempre y cuando el objeto de evento se ha creado usando el constructor new Event(), por ejemplo:

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

En el caso del parámetro de evento en los controladores de eventos, a pesar de su tipo es el objeto, que contiene el evento nativa como una propiedad, por lo que este se podría utilizar en su lugar:

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

Aquí hay que señalar que el valor real puede variar dependiendo del navegador, especialmente cuando el evento es un evento de contacto, ver here y referencias dentro. No es un problema en mi caso.

3

Puede verificar si el objeto tiene una propiedad originalEvent;

event.hasOwnProperty('originalEvent') 

por ejemplo:

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