2010-11-12 7 views
11

Podczas pracy z treści ładowanych asynchronicznie jest jakaś różnica z punktu widzenia wydajności pomiędzy:.

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

i ręcznie powiązać() zdarzenia, musimy za każdym razem po załadowaniu treści:

// 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/ –

Odpowiedz

13

Istnieją różne koszty, spójrzmy na nich:

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

Są 2 główne koszty tutaj:

  • Selektor #mybutton musi uruchomić natychmiast bez powodu (wynik jest wyrzucany Chcieliśmy po prostu wybrać selektor ... wiążemy się z document). W tym przypadku jest to #id selector, więc jest to bardzo niski koszt ... w innych przypadkach nie jest tani i bardzo nieekonomiczny (na przykład [attr=something]).
  • Każdy click, który ma bańki do document, musi teraz zostać sprawdzony pod kątem tego selektora, kosztu oceny za kliknięcie, zależy to od oczekiwanej liczby kliknięć.

Teraz spójrzmy na inny sposób:

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

Są 2 główne koszty również tutaj:

  • W #mybutton działa selektor, ale tylko raz na żądania ajax . Jednak nie marnujemy go, używamy wyników.
  • Handler click jest zobowiązany do rzeczywistego elementu, zamiast document, więc nie ma wiążącej kosztować każdorazowo działa, raczej niż raz

Jednakże, nie ma koszt za kliknięcie, a połączenie selektor nie jest zmarnowany ... więc ogólnie jest lepszy, , ponieważ używasz identyfikatora, nie jest to prawdą w innych przypadkach.


W twoim przypadku, ponieważ masz do czynienia z ID (i gwarancją pojedynczy element), jest to znacznie tańsze:

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

W innych przypadkach, gdzie jesteś wiążący setki elementów, .live(), są wyraźnym zwycięzcą, choć byłoby jeszcze lepiej.

+0

Zgodnie z "http://api.jquery.com/live/" metoda live może działać na elementach, które nie zostały jeszcze dodane do domingu. Tak więc w jego przypadku, chyba że program obsługi kliknięć rzeczywiście się zmienia, może po prostu ustawić go raz. A więc są tam pewne korzyści. Również w JQ1.4 może przestać bąbelkować na szczycie drzewa. – Simon

+0

ładna odpowiedź. Czy możesz wyjaśnić, co masz na myśli mówiąc "raczej niż dokumentować"? – nemesisdesign

+1

@nemesis: @Nick oznacza obiekt 'document', kontener dla wszystkich elementów na stronie. Zdarzenia "na żywo" są tam powiązane, dzięki czemu mogą łapać zdarzenia bez względu na to, gdzie występują na stronie. –

1

Prawdopodobnie trochę, ale nie martwiłbym się tym. Dla mnie metoda .live() wygląda o wiele łatwiejsza do utrzymania, więc użyłbym tego. Dopóki nic nie będzie boleć wolno, nie trzeba się martwić wydajnością w JavaScript.

+0

Nie zgadzam się. Aplikacja, którą buduję, intensywnie wykorzystuje blaknięcie, animacje, podpowiedzi, galerie itp., Więc chcę mieć pewność, że wszystko ładuje się tak płynnie, jak to tylko możliwe. Jeśli kod jest zorganizowany w dobry sposób, nie będzie to trudne. Zawinę wszystko w funkcję, która będzie ponownie używana dla każdego przypadku. – nemesisdesign

+0

OK, o ile dokładnie rozważyłeś wartość. Wiele osób robi duże zamieszanie z powodu optymalizacji w przypadkach, gdy jest to całkowicie niepotrzebne i właśnie tego doradzałem. –

+0

Tak, zgadzam się z tobą, w prostych przypadkach próba zaoszczędzenia 200ms to strata czasu. – nemesisdesign

1

Z wyglądu funkcji powodzenia dołączasz wydarzenie, ponieważ ten element jest już dostępny w twoim html? Czy tak jest?

Jeśli tak jest, to jeśli funkcja wywoływana za pomocą kliknięcia jest zawsze taka sama, można użyć "na żywo". Na żywo pozwala wiązać się z wydarzeniami, które jeszcze nie istnieją. Możesz to umieścić nawet przed swoim dokumentem. Następnie, gdy ajax aktualizuje twój główny dokument, to wydarzenie powinno zawsze działać. Nie musisz go przypisywać za każdym razem.

Dzięki temu masz pewność, że nie musisz nic robić za każdym razem, gdy wrócisz z wywołania ajax, robisz konfigurację bez polegania na document.ready i gwarantowane działanie.

HTH.