usar - scrolltop javascript ejemplos
¿Cómo determinar si el objeto Javascript es un evento? (7)
¿Cuál es la forma más segura de determinar si un objeto Javascript es un evento?
¿Qué hay de usar instanceof
? Siempre que el objeto de evento se haya 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, 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, ver here y referencias dentro. No es un problema en mi caso.
Es una buena práctica sondear objetos posiblemente "desconocidos" para las propiedades y métodos que espera encontrar.
Entonces, suponga que tiene un objeto de evento, y pruébelo antes de actuar en él, por ejemplo
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 se trata de un evento: está probando el objetivo porque está a punto de usar esa propiedad. A lo que me refiero es a que, en lugar de tratar de determinar si un objeto es un evento, pruebe el objeto para ver si se comporta de la manera que espera, y luego use 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, por ejemplo
if (event.initKeyEvent)
{
//gecko 1.9+
event.initKeyEvent(...)
}
Esta función isEvent verifica 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); }
No sé si hay una forma segura de hacerlo, pero creo que lo mejor es tipar patos.
De todos modos, dependiendo de la situación, puede verificar si un objeto dado tiene las propiedades esperadas que desea usar, tal como lo señaló Paul .
Pregunta anterior, 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 de su respuesta, pero fue muy 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 se trata de un evento.
Puede verificar si el objeto tiene una propiedad originalEvent;
event.hasOwnProperty(''originalEvent'')
p.ej:
// 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!
}
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;
}
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.