¿Cuál es la forma más segura de determinar si un objeto Javascript es un evento?

52
Tom 22 sep. 2009 a las 12:55

7 respuestas

La mejor respuesta

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

Por lo tanto, suponga que tiene un objeto de evento y pruébelo antes de actuar sobre él, p.

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

Es importante tener en cuenta que NO estoy sugiriendo que pruebe el 'objetivo' para ver si es un evento: está probando el objetivo porque está a punto de usar esa propiedad. Lo que estoy conduciendo es que, en lugar de tratar de averiguar si un objeto es un evento, sondear el objeto para ver si se comportará de la manera esperada, y luego usar esos comportamientos.

Un código como este debería degradarse con gracia en los navegadores con soporte diferente, o permitirle aprovechar las extensiones específicas del navegador, p.

if (event.initKeyEvent)
{
    //gecko 1.9+
    event.initKeyEvent(...)
}
51
Paul Dixon 22 sep. 2009 a las 10:01

Tengo la misma preocupación. Así que me propuse 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;
}

Probé 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.

0
Wilk 20 oct. 2012 a las 19:14

No sé si hay una manera segura de hacer eso, pero creo que tu mejor opción es escribir pato.

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

0
Community 23 may. 2017 a las 12:10

Antigua pregunta, pero aparentemente de acuerdo con esto, event.type es un navegador cruzado:

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

RameshVel agregó esto en una edición a su respuesta, pero fue fuertemente rechazado.

Por supuesto, la forma más segura es seguir la guía de la respuesta aceptada, pero sucedió que quiero descartar el objeto si es un evento.

3
Adam Marshall 4 abr. 2013 a las 09:48

Esta función isEvent comprueba el constructor para el objeto desconocido, lo convierte en una cadena y luego busca 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);  }
3
Cypher 15 dic. 2011 a las 16:16

Puede verificar si el objeto tiene una propiedad originalEvent;

event.hasOwnProperty('originalEvent')

E.g:

// 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!
}
5
Mark Teunissen 10 jun. 2015 a las 08:56

¿Qué tal usar instanceof? Siempre que el objeto de evento se haya creado utilizando 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, aunque su tipo es Object, contiene el evento nativo como una propiedad, por lo que podría usarse en su lugar:

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

Aquí debe tenerse en cuenta que el valor real puede variar según el navegador, especialmente cuando el evento es táctil, consulte aquí y referencias dentro. No es un problema en mi caso.

37
Community 23 may. 2017 a las 12:10