2012-04-07 28 views
14

Czy jest zalecane, aby w sytuacji, gdy potrzebuję uzyskać dostęp do wyniku selektora jQuery więcej niż jeden raz w zakresie funkcji, uruchomić selektor raz i przypisać go do zmiennej lokalnej?Wydajność selektorów jQuery a zmienne lokalne

Wybacz mój banalny przykład tutaj, ale myślę, że ilustruje to pytanie. Tak, będzie to szybsze wykonywanie kodu:

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

niż ten kod:

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

Jeśli nie ma różnicy, może ktoś wyjaśnić, dlaczego? Czy elementy jQuery są buforowane po ich wybraniu, aby kolejne selektory nie musiały ponownie przeszukiwać domeny?

+0

Dzięki wszystkim za odpowiedzi, chciałabym przyjąć je wszystkie – KodeKreachor

Odpowiedz

18

Ponowne odwołanie wyboru, pierwszym przypadku, to zdecydowanie szybciej. Oto test zrobiłem jako dowód:

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

tym ostatnim przypadku przedefiniowania swoich selektorów, jest podawana jako ~ 35% wolniej.

+0

Fajny test, bardzo miłe, ale jestem zdezorientowany ... to czerwony pasek reprezentujący przykład "zmiennej lokalnej", ponieważ jest to stan etykiety? Wygląda na to, że trwało to dłużej? – KodeKreachor

+0

Tak, czerwony jest zmienną lokalną. To trochę zagmatwane, tym lepiej na wykresie. Pokazuje, ile operacji można wykonać na sekundę. – weotch

+0

Dziękuję za wprowadzenie mnie na tę stronę. To jest fantastyczne! – tsherif

3

Przechowywanie odniesienia w zmiennej lokalnej będzie szybsze niż każdorazowe uruchamianie kodu wyboru. Chodzi po prostu o to, że nie musisz wykonywać ŻADNEGO kodu, aby znaleźć odpowiedni element (y), gdy przechowujesz go w zmiennej. Moja zasada polega na przechowywaniu wyników wyszukiwania jQuery w zmiennej, jeśli zamierzam użyć jej więcej niż raz.

1

Inną opcją jest tu użyć each zamiast powtarzać selektor, a to wiąże się praca, raz po raz

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

Jeśli jesteś zainteresowany wydajność, wielokrotnie ponownego przydzielania pamięci dla obiektów i zbędnych wywołań funkcji (przyznane, są one dość szybkie) wykonując ' $ (this) 'wielokrotnie za ten sam element jest mniejszy niż idealny. –

+1

* "Różnica polega na funkcji' attr' .Jeśli zastosujesz ją do kolekcji, wpłynie ona tylko na pierwszy element kolekcji. "* Nie, to prawda tylko w * get *. On * set *, ustawia dla wszystkich: http://api.jquery.com/attr/#attr2 –

+0

@ T.J.Wściekły, nie patrzyłem na sygnaturę metody, dla której czytałem dokumenty. – tvanfosson

8

not forget to jedno:

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

@weotch Świetnie. Nie byłem wystarczająco szybki, więc odwołałem moją identyczną odpowiedź ... Ale świetnie jest wiedzieć na pewno, że jest to opcja. Czy mógłbyś dodać to do jego testu prędkości? –

+1

+1. To jest rozwiązanie, które jQuery przewidywałoby, ponieważ większość ich przykładów zwykle łączy takie połączenia. Być może nie jest to szybsze niż zapisywanie zmiennych lokalnych, ale z pewnością jest szybsze niż wielokrotne wybory i uważam, że jest bardziej elegancki. – Neil

+2

Dodano ten test. Najpierw jest związany! – weotch

0

Ty rzeczywiście zapominając prawdziwie pamięci podręcznej podejście.

Rzeczą z jQuery jest to, że pierwsze wyszukiwanie: $('.selector') jest kosztowne. Ale potem, łańcuchowanie na nim swoich akcji, lub przypisanie jej do zmiennej i wykonanie twoich działań na zmiennej nie ma większego znaczenia. Najważniejszym osiągnięciem, jakie można uzyskać, jest buforowanie elementu jeszcze bardziej i nie przypisywanie selektora jQuery do każdej iteracji wywołania funkcji.

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

Takie podejście jest prawie dwa razy tak szybko, jak najszybciej wersja od innych podejść sugerowane.

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

Uwaga: W przypadku zmiany DOM podczas jego życia, można zaktualizować element zmienną ze świeżym doboru elementów.