2010-03-07 13 views
158

Sto cercando di trovare l'equivalente jQuery di questo metodo chiamata JavaScript:jQuery equivalente del metodo addEventListener di JavaScript

document.addEventListener('click', select_element, true); 

Ho ottenuto per quanto riguarda:

$(document).click(select_element); 

ma che doesn' t ottenere lo stesso risultato, come l'ultimo parametro del metodo JavaScript - un valore booleano che indica se il gestore di eventi deve essere eseguito nella fase di cattura o bubbling (per mia conoscenza da http://www.quirksmode.org/js/events_advanced.html) - viene omesso.

Come specificare tale parametro o comunque ottenere la stessa funzionalità utilizzando jQuery?

+3

cattura evento non è supportato da jQuery, come evento cattura non è supportato da IE, che supporta jQuery;) Stai cercando compatibilità IE? –

+0

Grazie, Crescent Fresh - Penso che abbia senso ora. Ho bisogno di compatibilità IE quindi suppongo di dover dimenticare la fase di acquisizione. – Bungle

risposta

116

non tutti i browser evento sostegno cattura (ad esempio, le versioni di Internet Explorer inferiore a 9 no), ma tutti fanno sostenere evento bubbling, motivo per cui è la fase utilizzata per associare i gestori agli eventi in tutte le astrazioni cross-browser, incluso jQuery.

il più vicino a quello che stai cercando in jQuery sta utilizzando bind() (sostituita da on() in jQuery 1.7+) oppure i metodi di jQuery specifici evento (in questo caso, click(), che chiama bind() internamente in ogni caso). Tutti usano la fase di bubbling di un evento sollevato.

+0

Grazie, Russ - questa è una buona spiegazione. – Bungle

+6

Sembra che IE9 lo supporti finalmente. http://blogs.msdn.com/b/ie/archive/2010/03/26/dom-level-3-events-support-in-ie9.aspx – some

+0

e perché non supportano la cattura degli eventi? quali sono i lati negativi della cattura di eventi? – Aakash

43

La cosa più vicina sarebbe la funzione bind:

http://api.jquery.com/bind/

$('#foo').bind('click', function() { 
    alert('User clicked on "foo."'); 
}); 
+0

Grazie, Ben! Lo apprezzo. – Bungle

101

Al jQuery 1.7, .on() ora è il metodo preferito di eventi di legame, anziché .bind():

Da http://api.jquery.com/bind/:

Al jQuery 1.7, il metodo .on() è il preferito metodo per che associa i gestori di eventi a un documento. Per le versioni precedenti, il metodo .bind() viene utilizzato per allegare un gestore eventi direttamente agli elementi . I gestori sono collegati agli elementi attualmente selezionati in l'oggetto jQuery, quindi tali elementi devono esistere nel momento in cui si verifica la chiamata a .bind(). Per un binding di eventi più flessibile, consultare la discussione della delega degli eventi in .on() o .delegate().

La pagina della documentazione si trova a http://api.jquery.com/on/

10

Ora si dovrebbe utilizzare la funzione .on() per associare eventi.

1

Ecco un ottimo trattamento per lo sviluppo della rete di Mozilla (MDN) di questo problema per JavaScript standard (se non si desidera fare affidamento su jQuery o capire meglio in generale):

https://developer.mozilla.org/en-US/docs/DOM/element.addEventListener

Ecco una discussione di flusso di eventi da un collegamento per il trattamento di cui sopra:

http://www.w3.org/TR/DOM-Level-3-Events/#event-flow

Alcuni punti chiave sono:

  • Esso permette di aggiungere più di un unico gestore per un evento
  • Ti dà un controllo più dettagliato della fase in cui l'ascoltatore viene attivato (cattura contro bolle)
  • Funziona su qualsiasi elemento DOM, non solo elementi HTML
  • Il valore di "questo" passato all'evento non è l'oggetto globale (finestra), ma l'elemento da cui viene generato l'elemento. Questo è molto conveniente.
  • codice per eredità IE browser è semplice e inclusi sotto la voce "Legacy Internet Explorer e attachEvent"
  • È possibile includere i parametri se si chiude il gestore in una funzione anonima
12

Una cosa da notare è che I metodi evento jQuery non attivano/intercettano load sui tag embed che contengono SVG DOM che viene caricato come documento separato nel tag embed. L'unico modo in cui ho trovato di intrappolare un evento load su questi era utilizzare JavaScript non elaborato.

Questo non funziona (ho provato on/bind/load metodi):

$img.on('load', function() { 
    console.log('FOO!'); 
}); 

Tuttavia, questo funziona:

$img[0].addEventListener('load', function() { 
    console.log('FOO!'); 
}, false); 
+1

dovrebbe essere notato questo è il modo corretto se si intende non sovrascrivere altri gestori di eventi associati per gli elementi. – r3wt

Problemi correlati