2013-01-18 15 views
6

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?

+0

Come viene chiamato 'eventHandler'? –

+0

@TravisJ che non è veramente rilevante vero? La domanda è: come possiamo testare se e? È un evento DOM. – Shmiddty

+0

@Shmiddty - Vedo, penso di aver frainteso la domanda. –

risposta

3

Non credo ci sia un modo affidabile per determinare se un dato oggetto è un evento DOM.

  1. typeof e sarà sempre tornare 'object' per gli oggetti di eventi veri e propri, che non è utile.
  2. Qualsiasi proprietà che è possibile verificare sull'oggetto può esistere sia in un oggetto Evento originale che in un oggetto non Event.
  3. Si potrebbe pensare che la catena del prototipo potrebbe essere utile per determinare questo, ma ha lo stesso problema del # 2 (può essere facilmente replicato).
  4. La proprietà 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.

+0

Grazie per la risposta completa. Lo sto marcando come accettato. –

0

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

+0

'var spoof = {target: someDOMNode, srcElement: someDOMNode};' non è un oggetto Event. – Shmiddty

+0

Quindi la funzione non è un gestore eventi – kidwon

+0

Una funzione è una funzione. Puoi chiamare una funzione da qualsiasi luogo (dove è in ambito). – Shmiddty

-1

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.

+0

Se si assegna il tipo, questo test ha esito negativo: 'e.type = 'click';' http://jsfiddle.net/eh6W7/1/ – Shmiddty

+0

Ho modificato il post. – AlecTMH

+0

Lo stesso problema ... basta aggiungere un metodo 'PreventDefault' all'oggetto e non si otterrà un errore di riferimento. – Shmiddty

Problemi correlati