Znalazłem dwa świetne artykuły mówiące o nowej funkcji .on()
: jquery4u.com , elijahmanor.com .
Czy jest jakiś sposób, w którym .bind()
nadal lepiej jest używać destylatora .on()
?
Na przykład mam przykładowy kod, który wygląda następująco:
$("#container").click( function( e ) {} )
Możesz zauważyć, że wybrałem tylko jeden element przez selektor, aw moim przypadku <div>
nazwa ta #container
już istnieje, gdy moja strona została załadowana; nie dodawane dynamicznie. Ważne jest, aby wspomnieć, że korzystam z najnowszej wersji jQuery: 1.7.2.
W przypadku tej próbki należy .on()
użyć zamiast, .bind()
nawet jeśli nie korzystam z innych funkcji udostępnianych przez .on()
funkcję?
javascript
jquery
jquery-selectors
Samuel
źródło
źródło
.bind()
źle jest wiązać wiele elementów, ale nie wspomina, jak.on()
w trybie wiązania robi dokładnie to samo.Odpowiedzi:
Wewnętrznie
.bind
odwzorowuje bezpośrednio.on
w bieżącej wersji jQuery. (To samo tyczy się.live
.) Tak więc, jeśli użyjesz.bind
zamiast tego, istnieje niewielki, ale praktycznie nieistotny spadek wydajności .Mogą jednak
.bind
zostać usunięte z przyszłych wersji w dowolnym momencie. Nie ma powodu, aby nadal używać.bind
i każdy powód, aby preferować.on
.źródło
.bind
i.on
są identyczne dla wydarzeń nieprzekazanych;.bind
nie zapewnia żadnego rodzaju skrótu jak$.getJSON
robiWszystkie te fragmenty działają dokładnie tak samo:
Jednak różnią się one bardzo od tych, które wszystkie wykonują to samo:
Drugi zestaw procedur obsługi zdarzeń korzysta z delegowania zdarzeń i będzie działał dla dynamicznie dodawanych elementów. Procedury obsługi zdarzeń korzystające z delegowania są również znacznie wydajniejsze. Pierwszy zestaw nie będzie działał dla dynamicznie dodawanych elementów i jest znacznie gorszy dla wydajności.
on()
Funkcja jQuery nie wprowadza żadnej nowej funkcjonalności, która jeszcze nie istniała, jest jedynie próbą standaryzacji obsługi zdarzeń w jQuery (nie musisz już wybierać między aktywowaniem, wiązaniem lub delegowaniem).źródło
$('selector').live('click', function () { ... });
, abyś utrzymał wynik jako możliwie jak najbardziej identyczny.Metody bezpośrednie i
.delegate
są doskonałymi interfejsami API.on
i nie ma zamiaru ich zastępować.Preferowane są metody bezpośrednie, ponieważ kod będzie mniej rygorystyczny. Natychmiastowy błąd pojawi się, gdy pomylisz nazwę zdarzenia zamiast cichego błędu. Moim zdaniem łatwiej jest też pisać i czytać
click
niżon("click"
.delegate
Jest lepsza.on
z powodu kolejności argument za:Od razu wiesz, że jest delegowany, ponieważ, no cóż, mówi delegat. Widoczny jest również selektor.
Nie
.on
jest od razu jasne, czy jest nawet delegowane, i musisz spojrzeć na koniec selektora:Nazewnictwo
.bind
jest naprawdę okropne i ma wartość nominalną gorszą niż.on
. Ale.delegate
nie można wykonywać zdarzeń nieprzekazanych, a są zdarzenia, które nie mają bezpośredniej metody, więc w rzadkich przypadkach, takich jak ten, można go użyć, ale tylko dlatego, że chcesz zachować czysty rozdział między zdarzeniami delegowanymi i nieprzekazanymi.źródło
Jeśli spojrzysz na kod źródłowy
$.fn.bind
, przekonasz się, że jest to tylko funkcja przepisywania dlaon
:http://james.padolsey.com/jquery/#v=1.7.2&fn=$.fn.bind
źródło
Z dokumentacji jQuery:
http://api.jquery.com/bind/
źródło
Począwszy od Jquery 3.0 i nowszych. .Indb jest przestarzałe i wolą zamiast niego używać .on. Jak @Blazemonger odpowiedział wcześniej, że może zostać usunięty i na pewno zostanie usunięty. W starszych wersjach .bind wywoływałby również wewnętrznie .on i nie ma między nimi żadnej różnicy. Więcej informacji można znaleźć w interfejsie API.
Dokumentacja jQuery API dla .bind ()
źródło