2011-01-02 1 views
102

Ho letto alcuni post qui e altrove sul Web in merito alle differenze tra live() e delegate(). Tuttavia non ho trovato la risposta che sto cercando (se questo è un capriccio, per favore dimmelo).Jquery live() vs delegate()

So che la differenza tra live e delegate è che live non può essere utilizzato in una catena. Ho anche letto da qualche parte che delegate è in alcuni casi più veloce (prestazioni migliori).

La mia domanda è, c'è una situazione in cui è necessario utilizzare live anziché delegate?

UPDATE

ho creato un simple test per vedere la differenza in termini di prestazioni.

Ho anche aggiunto il nuovo .on() che è disponibile in jQuery 1.7+

I risultati praticamente somma i problemi di prestazioni come indicato nelle risposte.

  • Non utilizzare .live() a meno che la vostra versione di jQuery non supporta .delegate().
  • Non utilizzare .delegate() a meno che la versione jQuery non supporti .on().

La differenza tra .live() e .delegate() è molto più grande di quello tra delegate() e .on().

+0

Alcune informazioni qui http://markupjavascript.blogspot.in/2013/10/bind-live-delegate- on-what-is-difference.html –

+0

Mi sono preso la libertà di riassumere questo eccellente post e altri utili commenti in un unico posto, per il mio record personale e nel caso in cui chiunque altro lo trovi utile. [** JQuery live vs delegate vs bind **] (http://www.timacheson.com/Blog/2011/oct/jquery_live_vs_delegate) – Tim

+0

A partire dalla versione 1.7, '.live()' non c'è più. Troverai invece il nuovo metodo '.on()'. –

risposta

147

Non uso mai live; Considero i vantaggi dell'utilizzo di delegate così sostanziale da risultare schiacciante.

L'uno dei vantaggi di live è che la sua sintassi è molto vicina a quella di bind:

$('a.myClass').live('click', function() { ... }); 

delegate, tuttavia, utilizza una sintassi leggermente più dettagliata:

$('#containerElement').delegate('a.myClass', 'click', function() { ... }); 

Questo, tuttavia, mi sembra molto più esplicito su ciò che sta realmente accadendo. Non ti rendi conto dall'esempio live che gli eventi vengono effettivamente acquisiti su document; con delegate, è chiaro che la cattura degli eventi avviene su #containerElement. Puoi fare la stessa cosa con live, ma la sintassi diventa sempre più orrenda.

Specificando un contesto per i tuoi eventi da catturare migliora anche le prestazioni. Con l'esempio live, ogni singolo clic sull'intero documento deve essere confrontato con il selettore a.myClass per vedere se corrisponde. Con delegate, si tratta solo degli elementi all'interno di #containerElement. Questo ovviamente migliorerà le prestazioni.

Infine, live richiede che il browser cerca a.myClassse sia o non esiste attualmente. delegate cerca gli elementi solo quando gli eventi vengono attivati, offrendo un ulteriore vantaggio in termini di prestazioni.


NB delegate utilizza live dietro le quinte, in modo da poter fare qualsiasi cosa con live che si può fare con delegate. La mia risposta si occupa di loro come sono comunemente usati.

Nota anche che né livedelegate è il modo migliore per eseguire la delega degli eventi nel moderno jQuery. La nuova sintassi (a partire da jQuery 1.7) è con la funzione on. La sintassi è la seguente:

$('#containerElement').on('click', 'a.myClass', function() { ... }); 
+4

+1. Il riutilizzo di un selettore precedente in 'live()' è fonte di confusione, portando a fraintendimenti da parte dell'utente su ciò che sta effettivamente facendo. 'delegate()' è più chiaro. Inoltre, sebbene 'delegate()' sia (attualmente) implementato usando 'live()', sta usando una versione a quattro argomenti di 'live()' che non è documentata, quindi presumibilmente solo per uso interno. Personalmente eviterei sempre 'live()' a meno che non dovessi correre su jQuery 1.3 per qualche ragione (speriamo di no). – bobince

+4

@all: Da jQuery docs: 'A partire da jQuery 1.4, gli eventi live possono essere associati a un" contesto "di elementi DOM piuttosto che alla root predefinita del documento. Non sarebbe' live() 'meglio usarlo ora da possiamo aggiungere il contesto dell'evento. Poiché 'delegate()' chiama 'live()' internamente. Quindi penso 1 chiamata di meno. O mi sbaglio? – PeeHaa

+0

Ottima risposta. Davvero fantastico. Tuttavia, preferisco ancora dal vivo. a meno che la mia applicazione non sia una gigantesca app js mostruosa, la semplicità della vita è maggiore del guadagno in termini di prestazioni. Inoltre, poiché userò solitamente bind (o una delle versioni più brevi), la vicinanza è ottima. Ancora una grande risposta. Mi ha fatto ottenere la differenza. +1. – frostymarvelous

3

due situazioni vengono in mente:

  1. si sarebbe utilizzando delegate sull'elemento body, così poi si può semplicemente utilizzare live, invece, come è più semplice.

  2. È necessario utilizzare una versione precedente della libreria jQuery, in cui l'evento delegate non è ancora stato implementato.

24

Essi sono esattamente gli stessi, tranne:

  • .delegate() consente di restringere il una sezione locale della pagina, mentre .live() deve elaborare gli eventi in tutta la pagina.
  • .live() inizia con una selezione DOM sprecato

Quando si chiama .delegate(), gira proprio dietro e chiama .live(), ma passa il contesto parametro in più.

https://github.com/jquery/jquery/blob/master/src/event.js#L948-950

Come tale, mi piacerebbe uso sempre .delegate().Se è davvero necessario che elabori tutti gli eventi nella pagina, assegnagli semplicemente il body come contesto.

$(document.body).delegate('.someClass', 'click', function() { 
    // run handler 
}); 

più vecchio versioni di jQuery in realtà hanno delegate funzionalità. Devi solo passare un selettore o un elemento come proprietà del contesto quando chiami .live(). Certo, ha bisogno di essere caricato sulla pagina.

$('.someClass', '#someContainer').live('click',function() { 
    // run handler 
}); 

E si ha lo stesso comportamento di .delegate().

+3

Non so perché questa risposta non ha più voti. '.delegate()' usa '.live()'. Per quanto riguarda le prestazioni, '.delegate()' chiaramente supera '.live()': http://stackoverflow.com/questions/2690370/live-vs-bind/7692651#7692651 –

+1

d'accordo .live è molto più lento. –

2

Si consideri l'esempio

<ul id="items"> 
    <li> Click Me </li> 
</ul> 

$('#items').delegate('li', 'click', function() { 
    $(this).parent().append('<li>New Element</li>'); 
}); 

Con il superamento di un elemento DOM come il contesto della nostra selettore, possiamo fare dal vivo() si comportano (quasi) lo stesso modo in cui delegato() fa. Allega il gestore al contesto, non al documento, che è il contesto predefinito. Il codice seguente è equivalente alla versione delegate() mostrata sopra.

$("li", $("#items")[0]).live("click", function() { 
    $(this).parent().append("<li>New Element</li>"); 
}); 

Resource

Ma, è meglio utilizzare delegato per migliorare le prestazioni see here