Prima di leggere questo, estrai questo elenco di eventi in un'altra pagina, l'API stessa è straordinariamente utile e tutto ciò di cui sto discutendo di seguito è collegato direttamente da questa pagina .
Innanzitutto, .click(function)
è letteralmente una scorciatoia per .bind('click', function)
, sono equivalenti. Usali quando associ un gestore direttamente a un elemento , in questo modo:
$(document).click(function() {
alert("You clicked somewhere in the page, it bubbled to document");
});
Se questo elemento viene sostituito o gettato via, questo gestore non sarà più lì. Inoltre, elementi che non erano presenti quando è stato eseguito questo codice per collegare il gestore (ad esempio, il selettore lo ha trovato in quel momento) non otterrà il gestore.
.live()
e .delegate()
sono collegati in modo simile, in .delegate()
realtà utilizza .live()
internamente, entrambi ascoltano gli eventi in bolla. Funziona con elementi nuovi e vecchi , fanno gli eventi nello stesso modo. Li usi quando i tuoi elementi possono cambiare, ad es. Aggiungendo nuove righe, elenchi di elementi, ecc. Se non hai un genitore / antenato comune che rimarrà nella pagina e non verrà sostituito in nessun punto, usa .live()
, in questo modo:
$(".clickAlert").live('click', function() {
alert("A click happened");
});
Se comunque hai un elemento genitore da qualche parte che non viene sostituito (quindi i suoi gestori di eventi non ci salutano) dovresti gestirlo con .delegate()
, in questo modo:
$("#commonParent").delegate('.clickAlert', 'click', function() {
alert("A click happened, it was captured at #commonParent and this alert ran");
});
Funziona quasi allo stesso modo .live()
, ma l'evento bolle meno volte prima di essere catturato e gli handler eseguiti. Un altro uso comune di entrambi è dire che la tua classe cambia su un elemento, non più corrispondente al selettore che hai usato originariamente ... con questi metodi il selettore viene valutato al momento dell'evento , se corrisponde, il gestore esegue .. . quindi l'elemento che non corrisponde più al selettore è importante, non verrà più eseguito. Con .click()
tuttavia, il gestore di eventi è proprio legato sull'elemento DOM, il fatto che essa non corrisponde a ciò che di selezione è stato utilizzato per scoprire che è irrilevante ... l'evento è legato e che è rimanere fino a quel elemento è andato, o il gestore viene rimosso tramite .unbind()
.
Ancora un altro uso comune per .live()
ed .delegate()
è la prestazione . Se hai a che fare con molti elementi, collegare un gestore di clic direttamente a ciascun elemento è costoso e richiede tempo. In questi casi è più economico impostare un singolo gestore e lasciare che il gorgogliamento faccia il lavoro, dai un'occhiata a questa domanda in cui ha fatto un'enorme differenza , è un buon esempio dell'applicazione.
Trigger : per la domanda aggiornata
Sono disponibili 2 principali funzioni di attivazione del gestore eventi, che rientrano nella stessa categoria "Collegamento gestore eventi" nell'API , queste sono .trigger()
e .triggerHandler()
. .trigger('eventName')
ha alcune scorciatoie integrate per gli eventi comuni, ad esempio:
$().click(fn); //binds an event handler to the click event
$().click(); //fires all click event handlers for this element, in order bound
Puoi visualizzare un elenco che include queste scorciatoie qui .
Per quanto riguarda la differenza, .trigger()
attiva il gestore eventi (ma non l'azione predefinita per la maggior parte del tempo, ad esempio posizionando il cursore nel punto giusto in un clic <textarea>
). Fa sì che i gestori di eventi si verifichino nell'ordine in cui erano associati (come farebbe l'evento nativo), attiva le azioni dell'evento nativo e crea bolle nel DOM.
.triggerHandler()
di solito è per uno scopo diverso, qui stai solo cercando di licenziare i gestori associati, non provoca l'evento nativo, ad esempio l'invio di un modulo. Non crea bolle nel DOM e non è concatenabile (restituisce qualunque sia il gestore dell'evento associato all'ultimo limite per quell'evento). Ad esempio, se si desidera attivare un focus
evento ma non focalizzare effettivamente l'oggetto, si desidera semplicemente .focus(fn)
eseguire il codice con cui si esegue il binding , ciò farebbe ciò, mentre .trigger()
lo si farebbe così come focalizzare l'elemento e fare bolle.
Ecco un esempio del mondo reale:
$("form").submit(); //actually calling `.trigger('submit');`
Ciò eseguirà qualsiasi gestore di invio, ad esempio il plugin di convalida jQuery , quindi tenterà di inviare il file <form>
. Tuttavia, se si desidera solo convalidare, poiché è collegato tramite un submit
gestore eventi, ma non inoltrare <form>
successivamente, è possibile utilizzare .triggerHandler('submit')
, in questo modo:
$("form").triggerHandler('submit');
Il plug-in impedisce al gestore di inviare il modulo bombardando se il controllo di convalida non passa, ma con questo metodo non ci interessa cosa fa. Che si sia interrotto o meno, non stiamo cercando di inviare il modulo, volevamo solo attivarlo per riconvalidare e fare nient'altro. ( Dichiarazione di non responsabilità: questo è un esempio superfluo poiché esiste un .validate()
metodo nel plugin, ma è una buona illustrazione dell'intento)