Czy jest jakaś różnica między następującym kodem?
$('#whatever').on('click', function() {
/* your code here */
});
i
$('#whatever').click(function() {
/* your code here */
});
Myślę, że różnica polega na wzorcach użytkowania.
Wolałbym .on
ponad .click
ponieważ były może zużywać mniej pamięci i pracy w dynamicznie dodanych elementów.
Rozważ następujący HTML:
<html>
<button id="add">Add new</button>
<div id="container">
<button class="alert">alert!</button>
</div>
</html>
gdzie dodajemy nowe przyciski za pomocą
$("button#add").click(function() {
var html = "<button class='alert'>Alert!</button>";
$("button.alert:last").parent().append(html);
});
i chcesz „Alert!” pokazać ostrzeżenie. Możemy użyć do tego „kliknięcia” lub „włączenia”.
click
$("button.alert").click(function() {
alert(1);
});
z powyższym, dla każdego elementu pasującego do selektora tworzony jest osobny moduł obsługi . To znaczy
.on
$("div#container").on('click', 'button.alert', function() {
alert(1);
});
z powyższym, jeden moduł obsługi dla wszystkich elementów pasujących do selektora, w tym tych tworzonych dynamicznie.
.on
Jak skomentował poniżej Adrien, kolejnym powodem użycia .on
są zdarzenia z przestrzenią nazw.
Jeśli dodasz moduł obsługi .on("click", handler)
, zwykle usuń go, za pomocą .off("click", handler)
którego usuniesz ten moduł. Oczywiście działa to tylko wtedy, gdy masz odniesienie do funkcji, więc co jeśli nie? Korzystasz z przestrzeni nazw:
$("#element").on("click.someNamespace", function() { console.log("anonymous!"); });
z niewiązaniem przez
$("#element").off("click.someNamespace");
on('click' ...)
, patrz stackoverflow.com/a/3973060/759452 tj.on('click.darkenallothersections' ...)
i jednocześnie mamon('click.displaynextstep' ...)
, to mogę cofnąć wiązanie tylko tego, którego wybrałem.unbind('click.displaynextstep')
on()
jest trendem w jQuery. Musiałem aktualizacji$(window).load(function() {});
do$(window).on("load", function (e) {})
kiedy uaktualniony do jQuery 3.Nie, nie ma różnicy funkcjonalnej między dwiema próbkami kodu w twoim pytaniu.
.click(fn)
jest „metodą skrótu” dla.on("click", fn)
. Z dokumentacji dla.on()
:Należy zauważyć, że
.on()
różni się od.click()
tego, że ma możliwość tworzenia delegowanych procedur obsługi zdarzeń poprzez przekazanieselector
parametru, podczas.click()
gdy nie. Gdy.on()
jest wywoływany bezselector
parametru, zachowuje się dokładnie tak samo jak.click()
. Jeśli chcesz delegować wydarzenie, użyj.on()
.źródło
selector
parametru. Jeśli dzwonisz.on()
bezselector
parametru, nie ma poprawy wydajności w porównaniu z użyciem.click()
..on()
jest zalecanym sposobem wykonania wszystkich powiązań zdarzeń od jQuery 1.7. To rzuca całą funkcjonalność zarówno.bind()
i.live()
do jednej funkcji, która zmienia zachowanie jak przekazać mu różne parametry.Jak napisałeś swój przykład, nie ma między nimi żadnej różnicy. Oba wiążą moduł obsługi z
click
zdarzeniem#whatever
.on()
oferuje dodatkową elastyczność, pozwalając na delegowanie zdarzeń uruchamianych przez dzieci z#whatever
jednej funkcji modułu obsługi, jeśli wybierzesz.źródło
.live()
robi? Wydaje się to również sprzeczne z innymi odpowiedziami, które mówią, że ma on jedynie funkcjonalność.click()
, a zatem nie dotyczy przyszłych wydarzeń..on()
może robić to, co.click()
robi, i robić.bind()
i.live()
robić - to zależy od parametrów, które wywołujesz. (Niektóre inne odpowiedzi też o tym wspominały.) Zauważ jednak, że „Powiązanie ze wszystkimi linkami w #cokolwiek” nie jest tym.live()
, co robi, ale tym, co.delegate()
robi..live()
wiąże się ze wszystkimi wewnątrz,document
a nie pozwala określić kontener. Uwaga.live()
jest również przestarzała od wersji jQuery 1.7.Jak wspomniano w innych odpowiedziach:
Zwraca jednak uwagę, że
.on()
obsługuje kilka innych kombinacji parametrów,.click()
co nie pozwala na obsługę delegowania zdarzeń (zastępowanie.delegate()
i.live()
).(I oczywiście istnieją inne podobne metody skrótów do „keyup”, „focus” itp.)
Powód, dla którego wysyłam dodatkową odpowiedź, to wspomnienie, co się stanie, jeśli zadzwonisz
.click()
bez parametrów:Zauważ, że jeśli używasz
.trigger()
bezpośrednio, możesz również przekazać dodatkowe parametry lub obiekt zdarzenia jQuery, z którym nie możesz tego zrobić.click()
.Chciałem również wspomnieć, że jeśli spojrzysz na kod źródłowy jQuery (w jquery-1.7.1.js), zobaczysz, że wewnętrznie funkcja
.click()
(lub.keyup()
itp.) Faktycznie wywoła.on()
lub.trigger()
. Oczywiście oznacza to, że możesz mieć pewność, że naprawdę mają ten sam wynik, ale oznacza to również, że używanie.click()
ma nieco więcej kosztów ogólnych - nie martw się ani nawet nie myśl o większości przypadków, ale teoretycznie może to mieć znaczenie w wyjątkowych okolicznościach.EDYCJA: Na koniec zauważ, że
.on()
pozwala powiązać kilka zdarzeń z tą samą funkcją w jednym wierszu, np .:źródło
.click()
.)Nie, nie ma.
Chodzi o
on()
inne przeciążenia i zdolność do obsługi zdarzeń, które nie mają metod skrótów.źródło
Wydają się być takie same ... Dokumentacja z funkcji click () :
Dokumentacja z funkcji on () :
źródło
.click
vs.on
.click
zdarzenia działają tylko wtedy, gdy element jest renderowany i są dołączane tylko do elementów ładowanych, gdy DOM jest gotowy..on
zdarzenia są dynamicznie dołączane do elementów DOM, co jest przydatne, gdy chcesz dołączyć zdarzenie do elementów DOM, które są renderowane na żądanie ajax lub coś innego (gdy DOM jest gotowy).źródło
Tutaj znajdziesz listę różnych sposobów zastosowania zdarzenia kliknięcia. Możesz wybrać odpowiednią opcję lub jeśli kliknięcie nie działa, po prostu wypróbuj alternatywę.
źródło
Odtąd przestarzałe click (), więc najlepiej wybrać opcję („click”)
źródło
O ile się dowiedział z Internetu i niektórych przyjaciół .on () jest używany, gdy dodajesz dynamicznie elementy. Ale kiedy użyłem go na prostej stronie logowania, na której zdarzenie click powinno wysłać AJAX do node.js, a po powrocie dołączyć nowe elementy, zaczął on wywoływać połączenia wielu AJAX. Kiedy zmieniłem to na click () wszystko poszło dobrze. Właściwie nie spotkałem się wcześniej z tym problemem.
źródło
NOWE ELEMENTY
Jako dodatek do wyczerpujących odpowiedzi powyżej, aby podkreślić kluczowe punkty, jeśli chcesz, aby kliknięcie dołączało do nowych elementów:
źródło
$(document).on('click','.UPDATE',function(){ });
działa skutecznie jak te same pobrane dane przy użyciu jquery. przycisk nie działa w momencie aktualizacji lub usuwania:źródło