Czy wszystkie zdarzenia jquery powinny być powiązane z $ (dokument)?
Kiedy po raz pierwszy nauczyłem się jQuery, zwykle dołączałem takie wydarzenia:
$('.my-widget a').click(function() {
$(this).toggleClass('active');
});
Po dowiedzeniu się więcej o szybkości selektora i delegowaniu zdarzeń przeczytałem w kilku miejscach, że „delegacja jQuery sprawi, że kod będzie szybszy”. Zacząłem więc pisać taki kod:
$('.my-widget').on('click','a',function() {
$(this).toggleClass('active');
});
Był to również zalecany sposób replikowania zachowania przestarzałego zdarzenia .live (). Co jest dla mnie ważne, ponieważ wiele moich witryn dynamicznie dodaje / usuwa widżety przez cały czas. Powyższe nie zachowuje się dokładnie tak jak .live (), ponieważ tylko elementy dodane do już istniejącego kontenera „.my-widget” będą zachowywać się. Jeśli dynamicznie dodam kolejny blok html po uruchomieniu tego kodu, elementy te nie będą wiązały zdarzeń z nimi związanych. Lubię to:
setTimeout(function() {
$('body').append('<div class="my-widget"><a>Click does nothing</a></div>');
}, 1000);
Dołączam teraz wszystkie takie wydarzenia:
$(document).on('click.my-widget-namespace', '.my-widget a', function() {
$(this).toggleClass('active');
});
Który wydaje się spełniać wszystkie moje cele. (Tak, z jakiegoś powodu jest wolniejszy w IE, nie wiem dlaczego?) Jest szybki, ponieważ tylko pojedyncze zdarzenie jest powiązane z pojedynczym elementem, a selektor dodatkowy jest oceniany tylko wtedy, gdy zdarzenie wystąpi (proszę poprawić mnie, jeśli jest to błędne). Przestrzeń nazw jest niesamowita, ponieważ ułatwia przełączanie nasłuchiwania zdarzeń.
Zaczynam myśleć, że zdarzenia jQuery powinny zawsze być powiązane z $ (dokument).
Czy jest jakiś powód, dla którego nie chcesz tego robić?
Czy można to uznać za najlepszą praktykę? Jeśli nie, dlaczego?
Jeśli przeczytałeś to wszystko, dziękuję. Doceniam wszelkie / wszystkie opinie / spostrzeżenia.
Założenia:
Używanie jQuery, które obsługuje.on()
// co najmniej wersja 1.7Chcesz, aby wydarzenie zostało dodane do dynamicznie dodanej zawartościOdczyty / Przykłady:
http://24ways.org/2011/your-jquery-now-with-less-suckhttp://brandonaaron.net/blog/2010/03/4/event-delegation-with-jqueryhttp://www.jasonbuckboyer.com/playground/speed/speed.htmlhttp://api.jquery.com/on/