2010-07-19 19 views
17

Desidero utilizzare eventi jQuery personalizzati indipendentemente dagli elementi DOM, ma non sono sicuro di quale sia il modo migliore per ottenere ciò.eventi personalizzati globali in jQuery

Ecco quello che ho iniziato con:

// some system component registers an event handler 
$().bind("foo.bar", handler); // foo is my app's namespace, bar is event name 
// another part of the system fires off the event 
$().trigger("foo.bar", { context: "lorem ipsum" }); 

Dopo aver guardato alla fonte di jQuery, in particolare la sua gestione di eventi globali AJAX, ho pensato che questo dovrebbe funzionare:

$.fn.bind("foo.bar", handler); 
// ... 
$.event.trigger("foo.bar", { context: "lorem ipsum" }); 

Tuttavia, sembra che la mia funzione di gestore non viene mai nemmeno chiamata.

Sto forse andando su questo nel modo sbagliato?

+0

in realtà è ". ", vedi http://docs.jquery.com/Namespaced_Events – MyGGaN

+0

Penso che questo artical è utile per questa domanda http://tdanemar.wordpress.com/2010/01/19/global -events-with-jquery/ –

risposta

32

Se si utilizza jQuery >1.4, quindi $() restituisce una raccolta jQuery vuota che significherebbe che nessun gestore di eventi è effettivamente associato a qualcosa. Prima di 1.4 avrebbe restituito lo stesso come jQuery(document).

Potrebbe essere meglio avere semplicemente uno spazio dei nomi globale (un oggetto reale) e quindi aggiungere eventi che:

var FOO = {}; 

$(FOO).bind("foo.bar", handler); 

$(FOO).trigger("foo.bar", { context: "lorem ipsum" }); 
+1

Non mi ero reso conto che potresti/dovresti racchiudere jQuery attorno ad un oggetto normale - ma funziona alla grande, e potrebbe anche significare che non ho bisogno di namespace il nome dell'evento (come vincolare l'evento a un particolare l'oggetto previene già gli scontri). Grazie! – AnC

+6

Una cosa da ricordare sarà che mentre siamo in grado di associare eventi a qualsiasi oggetto JavaScript, non possiamo rimuoverli con 'unbind'. Bisogno di usare 'removeData' per quello. – Anurag

+1

Non lo sapevo! Dovrà trovare una buona risorsa per leggerlo ... – AnC

3

ho trovato la mia strada qui perché stavo cercando di implementare il modello editore/sottoscrittore utilizzando eventi personalizzati con nomi assegnati usando jQuery. Mentre la soluzione accettata è un modo di usare $ .event.trigger() in un modo che non è legato agli elementi DOM, non funzionerà bene per un'implementazione di vero evento globale in un'architettura di editore/sottoscrittore (come con un interfaccia utente complessa con molte azioni asincrone), in cui si desidera che oggetti/elementi arbitrari ascoltino un evento personalizzato.

Attraverso la sperimentazione, ho trovato che la vera risposta al motivo per cui gli eventi di AnC non stavano sparando è perché jQuery apparentemente non consente il "." (punto) carattere nei nomi di eventi personalizzati ... ma i trattini bassi sembrano essere ok.

Quindi, se dai un nome ai tuoi eventi qualcosa di simile a foo_bar (anziché a foo.bar), il tuo codice dovrebbe funzionare come previsto. Testato con jQuery 1.4.4.

Modifica: Per essere chiari, voglio dire che i periodi non sono consentiti per eventi personalizzati se si desidera utilizzare il meccanismo $ .event.trigger(). Negli scenari in cui gli eventi vengono attivati ​​da oggetti o elementi, i periodi sembrano essere ok ... non sono sicuro se questo è un bug o di progettazione.

+0

I suoni sono interessanti - hai un link che spiega l'uso senza DOM di $ .event.trigger? Potresti anche segnalare questo problema ai membri di jQuery, lasciare che decidano se si tratta di un bug. Da allora ho iniziato a esaminare le alternative: PubSubJS sembra fantastico (ed è piccolo): http://roderick.dk/blog/2010/10/12/introducing-pubsubjs-a-library-for-doing-publish-subscribe- in-javascript / – AnC

Problemi correlati