2010-11-12 7 views
11

Quando si lavora con i contenuti caricati in modo asincrono v'è alcuna differenza da un punto di vista delle prestazioni tra:.

// .live() 
$('#mybutton').live('click', function(e){ doSomething(); }); 

e manualmente bind() gli eventi di cui abbiamo bisogno ogni volta dopo che il contenuto è stato caricato:

// manual bind every time 
$.ajax({ 
    url: url, 
    success: function(data){ 
     mycontainer.html(data); // data contains #mybutton 
     $('#mybutton').click(function(e){ doSomething(); }); 
    } 
}); 

?

+1

http://www.artzstudio.com/2009/04/jquery-performance-rules/ –

risposta

13

Non ci sono costi diversi, diamo un'occhiata a loro:

$('#mybutton').live('click', function(e){ doSomething(); }); 

Ci sono 2 principali costi qui:

  • Il selettore #mybutton ha la necessità di eseguire immediatamente per nessun motivo (il risultato si butta via , volevamo solo il selettore comunque ... siamo vincolati a document). In questo caso è un #id selector quindi è un costo molto basso ... in altri casi non è economico e molto dispendioso (ad esempio [attr=something]).
  • Ogni click che bolle fino a document deve ora essere confrontato con questo selettore, un costo di valutazione per clic, che varia in base al numero di clic previsti.

Ora diamo un'occhiata a l'altro metodo:

$('#mybutton').click(function(e){ doSomething(); }); 

Ci sono 2 principali costi qui così:

  • I #mybutton piste di selezione, ma solo una volta per ogni richiesta ajax . Tuttavia, non lo stiamo sprecando, stiamo usando i risultati.
  • Il gestore click è legato a un elemento reale, piuttosto che document, quindi c'è un costo vincolante ogni volta che viene eseguito, invece di una volta

Tuttavia, non c'è nessun costo per clic e la chiamata di selezione di per sé non è sprecato ... quindi è complessivamente migliore, dal momento che stai usando un ID, questo non è vero negli altri casi.


Nel tuo caso, dal momento che hai a che fare con un ID (e garantito un unico elemento), questo è molto più conveniente:

$('#mybutton').click(function(e){ doSomething(); }); 

In altri casi, dove si sta vincolante centinaia di elementi, .live() è il chiaro vincitore, anche se .delegate() sarebbe ancora meglio.

+0

Secondo 'http://api.jquery.com/live/' il metodo live può funzionare su elementi non ancora aggiunti al dominio. Quindi, nel suo caso, a meno che il gestore di clic non cambi effettivamente, può semplicemente impostarlo una volta. Quindi ci sono alcuni guadagni da avere lì. Inoltre, con JQ1.4 può fermarlo ribollendo fino alla cima dell'albero. – Simon

+0

bella risposta. Potresti spiegare cosa intendi con "piuttosto che documentare"? – nemesisdesign

+1

@nemesis: @Nick indica l'oggetto 'document', il contenitore per tutti gli elementi nella pagina. Gli eventi 'live' sono associati lì in modo che possano catturare gli eventi indipendentemente da dove si verificano nella pagina. –

1

Probabilmente un po ', ma non me ne preoccuperei. Per me il metodo .live() sembra molto più facile da mantenere, quindi lo userei. Finché non rallenta niente, non c'è bisogno di preoccuparsi delle prestazioni in JavaScript.

+0

Non sono d'accordo. L'app che sto costruendo fa un uso intensivo di fading, animazioni, tooltip, gallerie e cose del genere quindi voglio essere sicuro che tutto si carichi nel modo più fluido possibile. Se il codice è organizzato in modo corretto, non sarà difficile da mantenere. Comprenderò tutto in una funzione che verrà riutilizzata per ogni caso. – nemesisdesign

+0

Ok, a patto che tu abbia attentamente considerato il valore. Molte persone fanno molta confusione sull'ottimizzazione nei casi in cui è completamente inutile, e questo è ciò che sconsigliavo. –

+0

Sì, sono d'accordo con te, in casi semplici cercando di risparmiare 200ms è una perdita di tempo. – nemesisdesign

1

Dall'aspetto della funzione di successo, stai allegando un evento perché quell'elemento è ora disponibile nel tuo html? È così?

In questo caso, se la funzione chiamata tramite il clic è sempre la stessa, è possibile utilizzare "live". Live ti consente di associare eventi che non esistono ancora. Quindi puoi inserirla anche prima del tuo documento. Già. Quindi, mentre l'ajax aggiorna il tuo documento principale, quell'evento dovrebbe sempre funzionare. Non dovrai assegnarlo ogni volta.

Così si ottiene il vantaggio in termini di prestazioni di non dover fare qualcosa ogni volta che si torna da una chiamata Ajax, si esegue la configurazione senza fare affidamento su document.ready e il suo garantito per funzionare.

HTH.

Problemi correlati