2012-04-07 15 views
14

È consigliabile che, quando è necessario accedere al risultato di un selettore jQuery più di una volta nell'ambito di una funzione, eseguo il selettore una sola volta e lo assegni a una variabile locale?Prestazioni dei selettori jQuery vs variabili locali

Perdonare il mio esempio banale qui, ma penso che illustri la domanda. Quindi, sarà questo codice eseguire più velocemente:

var execute = function(){ 
    var element = $('.myElement'); 
    element.css('color','green'); 
    element.attr('title','My Element'); 
    element.click(function(){ 
     console.log('clicked'); 
    }); 
} 

di questo codice:

var execute = function(){ 
    $('.myElement').css('color','green'); 
    $('.myElement').attr('title','My Element'); 
    $('.myElement').click(function(){ 
     console.log('clicked'); 
    }); 
} 

Se non v'è alcuna differenza, qualcuno può spiegare perché? Gli elementi della cache di jQuery dopo averli selezionati in modo che i selettori successivi non debbano preoccuparsi di cercare nuovamente nella dom?

+0

Grazie a tutti per le vostre risposte, vorrei poterli accettare tutti – KodeKreachor

risposta

18

Riusare il riferimento di selezione, il tuo primo caso, è sicuramente più veloce. Ecco un test che ho fatto come prova:

http://jsperf.com/caching-jquery-selectors

Quest'ultimo caso, ridefinendo i vostri selettori, viene segnalato come ~ 35% più lento.

+0

Cool test, molto bello, ma sono confuso ... è la barra rossa che rappresenta l'esempio di 'variabile locale', come recita l'etichetta? Sembra che ci sia voluto più tempo? – KodeKreachor

+0

Sì, rosso è la variabile locale. È un po 'confuso, più lungo è meglio nel grafico. Rappresenta il numero di operazioni che possono essere eseguite al secondo. – weotch

+0

Grazie per avermi presentato a quel sito. È fantastico! – tsherif

3

Memorizzare il riferimento in una variabile locale sarà più veloce di eseguire il codice di selezione ogni volta. Si tratta semplicemente di non dover eseguire QUALSIASI codice per trovare gli elementi appropriati quando lo si archivia in una variabile. La mia regola generale è quella di memorizzare i risultati della ricerca jQuery in una variabile se la userò più di una volta.

1

Un'altra opzione è quella di utilizzare un each invece di ripetere il selettore e è associato il lavoro, di volta in volta

var execute = function(){ 
    $('.myElement').each(function() { 
     var elem = $(this); 
     elem.css('color','green'); 
     elem.attr('title','My Element'); 
     elem.click(function(){ 
     console.log('clicked'); 
     }); 
    }); 
} 
+1

Se siete interessati alle prestazioni, ripetutamente ridistribuendo memoria per oggetti e facendo chiamate di funzioni non necessarie (concesse, sono abbastanza veloci) facendo ' $ (questo) 'più e più volte per lo stesso elemento non è l'ideale. –

+1

* "La differenza è nella funzione' attr'. Se la si applica a una raccolta, interessa solo il primo elemento della collezione. "* No, è vero solo su * get *. Su * set *, lo imposta per tutti: http://api.jquery.com/attr/#attr2 –

+0

@ T.J.Crowder mio cattivo, non ho guardato la firma del metodo per cui stavo leggendo i documenti. – tvanfosson

8

Non dimenticare questo:

var execute = function(){ 
    $('.myElement') 
     .css('color','green') 
     .attr('title','My Element') 
     .click(function(){ 
      console.log('clicked'); 
     }); 
} 
+0

@weotch Grande. Non ero abbastanza veloce, quindi ho cancellato la mia identica risposta ... Ma è bello sapere con certezza che questa è un'opzione. Potresti aggiungere questo weotch al suo test di velocità? –

+1

+1. Questa è la soluzione che jQuery avrebbe immaginato poiché la maggior parte dei loro esempi tende a concatenare le chiamate in questo modo. Forse non è più veloce del salvataggio in variabili locali, ma è sicuramente più veloce delle selezioni multiple e direi che è più elegante. – Neil

+2

Aggiunto questo test. Sembra legato per primo! – weotch

0

Si sta effettivamente dimenticare l'approccio veramente nella cache.

La cosa con jQuery è che la ricerca iniziale: $('.selector') è costosa. Ma dopo, concatenare le tue azioni su di esso o assegnarle a una variabile ed eseguire le tue azioni sulla variabile non importa molto. Il guadagno di prestazioni principale che si può ottenere è il caching dell'elemento ancora di più e non si assegna al selettore jQuery ogni iterazione della propria chiamata di funzione.

var element = $('.myElement'); 
var execute = function(){ 
    element.css('color','green'); 
    element.attr('title','My Element'); 
    element.click(function(){ 
     console.log('clicked'); 
    }); 
} 

questo approccio è quasi due volte più veloce della versione più veloce rispetto agli altri approcci suggerito.

Vedi http://jsperf.com/caching-jquery-selectors/17

Nota: se le modifiche DOM durante il suo ciclo di vita, è possibile aggiornare la variabile element con una nuova selezione di elementi.