W jQuery v1.7 dodano nową metodę on
. Z dokumentacji:
Metoda .on () dołącza procedury obsługi zdarzeń do aktualnie wybranego zestawu elementów w obiekcie jQuery. Od wersji jQuery 1.7 metoda .on () zapewnia wszystkie funkcje wymagane do dołączania programów obsługi zdarzeń. '
Jaka jest różnica między live
i bind
?
Odpowiedzi:
on()
jest próbą połączenia większości funkcji wiązania zdarzeń jQuery w jedną. To ma dodatkowy bonus sprzątania nieefektywności zlive
vsdelegate
. W przyszłych wersjach jQuery te metody zostaną usunięte i tylkoon
ione
pozostaną.Przykłady:
Wewnętrznie jQuery mapuje wszystkie te metody i skrócone metody ustawiające programy obsługi zdarzeń na
on()
metodę, co dodatkowo wskazuje, że od teraz należy ignorować te metody i po prostu używaćon
:Zobacz https://github.com/jquery/jquery/blob/1.7/src/event.js#L965 .
źródło
$(document.body).delegate("click", ".mySelector", fn);
powinno być$(document.body).delegate(".mySelector", "click", fn);
on
jest w naturze bardzo bliskodelegate
. Dlaczego więc nie użyć delegata? To dlatego,on
że nie przychodzi sam. istniejeoff
, aby usunąć powiązanie zdarzenia ione
utworzyć zdarzenie, które ma być wykonane tylko raz. To jest „pakiet” nowego wydarzenia.Głównym problemem
live
jest to, że dołącza się do „okna”, wymuszając zdarzenie kliknięcia (lub inne zdarzenie) na elemencie znajdującym się głęboko w strukturze strony (dom), aby „unieść się” na górę strony w celu znalezienia zdarzenia opiekun chce się tym zająć. Na każdym poziomie wszystkie programy obsługi zdarzeń muszą zostać sprawdzone, może to szybko się sumować, jeśli wykonujesz głębokie imbrication (<body><div><div><div><div><table><table><tbody><tr><td><div><div><div><ul><li><button> etc etc etc...
)Tak więc,
bind
podobnieclick
jak inne spoiwa skrótów zdarzeń dołączane są bezpośrednio do celu zdarzenia. Jeśli masz tabelę składającą się, powiedzmy, z 1000 wierszy i 100 kolumn, a każda ze 100 000 komórek zawiera pole wyboru, którego kliknięcie chcesz obsłużyć. Dołączenie 100 000 programów obsługi zdarzeń zajmie dużo czasu podczas ładowania strony. Tworzenie pojedynczego zdarzenia na poziomie tabeli i używanie delegowania zdarzeń jest o kilka rzędów wielkości bardziej wydajne. Cel zdarzenia zostanie pobrany w czasie wykonywania zdarzenia. „this
” będzie tabelą, ale „event.target
” będzie zwykłym „this
” wclick
funkcji. Teraz fajną rzecząon
jest to, że „this
” zawsze będzie celem zdarzenia, a nie kontenerem, do którego jest dołączony.źródło
przy użyciu
.on
metody można to zrobić.live
,.delegate
i.bind
przy użyciu tej samej funkcji, ale.live()
tylko przy użyciu.live()
jest możliwe (delegowanie zdarzeń do dokumentu).jQuery("#example").bind( "click", fn )
=jQuery( "#example").on( "click", fn );
jQuery("#example").delegate( ".examples", "click", fn )
=jQuery( "#example" ).on( "click", ".examples", fn )
jQuery("#example").live( fn )
=jQuery( document ).on( "click", "#example", fn )
Mogę to potwierdzić bezpośrednio ze źródła jQuery:
jQuery (this.context)?
this.context
===document
w większości przypadkówźródło
(Moje zdanie początkowe miało więcej sensu, zanim zmieniłeś pytanie. Pierwotnie powiedziałeś „Jaka jest różnica
live
?”)on
jest bardziej podobnydelegate
niż jestlive
, jest w zasadzie ujednoliconą formąbind
idelegate
(w rzeczywistości zespół powiedział, że jego celem jest „... ujednolicenie wszystkich sposobów dołączania wydarzeń do dokumentu ...” ).live
jest w zasadzieon
(lubdelegate
) dołączony do dokumentu jako całości. Jest przestarzały od wersji 1.7 na korzyść używaniaon
lubdelegate
. Podejrzewam, że w przyszłości zobaczymy kod wykorzystującyon
wyłącznie, a niebind
lubdelegate
(lublive
) ...W praktyce możesz więc:
Użyj
on
jakbind
:Użyj
on
likedelegate
(delegacja zdarzenia zakorzeniona w danym elemencie):Użyj
on
likelive
(delegacja zdarzenia zakorzeniona w dokumencie):źródło
on
to kombinacjabind
idelegate
, i jak powiedziałem, niezbyt podobnalive
. Możesz użyćon
likebind
(dołącz procedurę obsługi bezpośrednio do elementu) lub możesz użyćon
likedelegate
(dołącz procedurę obsługi do elementu, ale uruchom zdarzenie tylko wtedy, gdy kliknięty element pasuje do selektora i tak jakby ten element był tym zdarzenie miało miejsce - np. delegacja zdarzenia), lub możesz go użyć w podobny sposóblive
(delegate
używając dokumentu jako root). To delegacja zdarzenia sprawia, że jest przydatna, jeśli dodajesz elementy dynamicznie.$("#id", ".class").live(fn)
=$(".class").delegate("#id", fn );
Właściwie w starym źródle jQuery używali live jako przypadku ogólnego i delegata jako przypadku specjalnego, co czyniło to tym bardziej zagmatwanym, kiedy się nad tym zastanowić.delegate
szybko, ale nadal. :-)live jest teraz skrótem do .on ()
również ten post może być dla Ciebie przydatny http://blog.jquery.com/2011/11/03/jquery-1-7-released/
źródło
Nie ma jednego dla podstawowego przypadku użycia. Te dwie linie są funkcjonalnie takie same
.on () może również delegować zdarzenia i jest preferowane.
.bind () jest teraz po prostu aliasem dla .on (). Oto definicja funkcji bind w wersji 1.7.1
Pomysł na dodanie .on () polegał na stworzeniu ujednoliconego interfejsu API zdarzeń, zamiast posiadania wielu funkcji do wiązania zdarzeń; .on () zastępuje .bind (), .live () i .delegate ().
źródło
Coś, o czym powinieneś wiedzieć, jeśli chcesz uzyskać obsługę zdarzeń skojarzonych z elementem - zwróć uwagę, do którego elementu została dołączona funkcja obsługi!
Na przykład, jeśli używasz:
otrzymasz programy obsługi zdarzeń za pomocą:
Ale jeśli używasz:
otrzymasz programy obsługi zdarzeń za pomocą:
(w ostatnim przypadku odpowiedni obiekt zdarzenia będzie miał selector = ". mySelector")
źródło
events
i tak jest nieudokumentowany i myślę, że już nie działa w 1.9