Dall'interno di una funzione comeprova se un oggetto c'è un evento DOM
function eventHandler(e) {
// ...
}
è un modo affidabile ed efficiente per determinare se e
è un evento DOM?
Dall'interno di una funzione comeprova se un oggetto c'è un evento DOM
function eventHandler(e) {
// ...
}
è un modo affidabile ed efficiente per determinare se e
è un evento DOM?
Non credo ci sia un modo affidabile per determinare se un dato oggetto è un evento DOM.
typeof e
sarà sempre tornare 'object'
per gli oggetti di eventi veri e propri, che non è utile.contructor
potrebbe sembrare promettente, ma si potrebbe fare questo:function DummyEvent(){
this.constructor.toString = function(){
return "function MouseEvent() { [native code] }";
}
}
Questo finisce per fare console.log(e.constructor)
stampa "function MouseEvent() { [native code] }"
Quindi, c'è un modo "affidabile" per dire se un oggetto è un evento? No.
Modifica — Si noti che tutto ciò è irrilevante se si desidera impedire lo spoofing degli eventi poiché è possibile creare facilmente eventi reali.
var evt = new Event('click');
var evt2 = document.createEvent('MouseEvents');
evt2.initMouseEvent('click', ...);
//etc
Edit2 — ho creato un test jsFiddle cercando di trovare un modo per distinguere gli oggetti, ma non ho ancora trovato nulla di preciso. Si noti che non mi sono preoccupato di specificare le proprietà su DummyEvent
perché è evidente che queste possono essere facilmente falsificate.
Grazie per la risposta completa. Lo sto marcando come accettato. –
Forse se l'evento bolle event.bubbles
attraverso il DOM è l'evento DOM. Ma anche se questa affermazione è vera, la sua propagazione potrebbe essere interrotta.
AGGIORNATO:
OK la proprietà che stai cercando è e.target
e per IE e.srcElement
. Entrambe le proprietà restituiscono l'elemento HTML su cui si è verificato l'evento e che lo definisce come evento DOM .
Tuttavia, forse dovresti specificare ciò che interpreti come evento DOM. Vuoi dire eventi nativi del suo navigatore web, perché questo è l'evento DOM troppo:
var zoo = jQuery('#zoo');
zoo.bind('moo');
zoo.trigger('moo');
Si binded a un nodo DOM
in jQuery ho creato una funzione di test, qualcosa di simile:
function isEvent(e) {
try {
e.PreventDefault();
return true;
}
catch (err) {
return false;
}
}
e testing di codice:
var o = new Object();
var e = $.Event('click');
alert(isEvent(o));
alert(isEvent(e));
l'ex avviso mostra falso, mentre il secondo mostra vero. Vedi fiddle.
AGGIORNAMENTO: è più sicuro chiamare qualcosa come preventDefault anziché trigger.
Come viene chiamato 'eventHandler'? –
@TravisJ che non è veramente rilevante vero? La domanda è: come possiamo testare se e? È un evento DOM. – Shmiddty
@Shmiddty - Vedo, penso di aver frainteso la domanda. –