jQuery: live() czy delegate()?
Opublikowany: 30.11.2011 10:16:58 | Komentarzy 0
Od jQuery w wersji 1.7 metoda live() ma status depracated (przestarzała) i zespół jQuery nie poleca używania jej. Jednak, pytanie o różnice live() i delegate() bardzo często pada na rozmowach kwalifikacyjnych gdy kandydat wpisze w CV, że zna jQuery. Warto znać tą subtelną różnicę.
live()
Służy do podpięcia eventu elementowi (lub elementom), który pasuje do selektora. Dodatkowo live powoduje podpinanie zdarzen nawet dla elementów, które będą tworzone dynamicznie np. na podstawie odpowiedzi z backendu.
Problem jednak z w tym, że wszystkie zdarzenia tworzone przez live() odnoszą się do elementu document, przez co wywoływanie eventów może być bardzo czasochłonne (w zależności od "długości" ścieżki). To jest największa wada live. Do tego dochodzą jeszcze inne np.:
- Przypisywanie zdarzeń poprzez chaining nie będzie działa poprawnie. Np.
$('#element div.element').find('.innyElement').live(...); - Może dojść do nieoczekiwanych zdarzeń, bo live() współdziała z innymi zdarzeniami.
- Używanie event.stopPropagation() jest nieefektywne, gdy chcemy zapobiec rozprzestrzenianiu się przypiasnym eventom niżej w hierarchi.
delegate()
Z kolei delegate() pozwala na przypisanie zdarzeń elementom pasującym do selektora, z tą różnicą, że określony jest element główny (tzw. root). Oczywiście zdarzenia będą reagować dla elementów, które zostały stworzone dynamicznie. Przykładowy kod:
$("ul.menu").delegate("a", "click", function() { //... });
Elementem głównym będą wszystkie listy nieuporządkowane posiadające klasę "menu".
Jeżeli ktoś chce mieć niezbity dowód na wyższość delegete nad live niech przeprowadzi i zobaczy wyniki testów na jsPerf.
Odpowiadając na tytułowe pytanie, odpowiedź brzmi: delegate() (od wersji 1.7 on()).
Komentarze
Dodaj komentarz