.bind () vs. .on () jQuery's

207

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 #containerjuż 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ę?

Samuel
źródło
5
ten drugi artykuł to śmieci. Mówi o tym, jak .bind()źle jest wiązać wiele elementów, ale nie wspomina, jak .on()w trybie wiązania robi dokładnie to samo.
Alnitak,

Odpowiedzi:

316

Wewnętrznie .bindodwzorowuje bezpośrednio .onw bieżącej wersji jQuery. (To samo tyczy się .live.) Tak więc, jeśli użyjesz .bindzamiast tego, istnieje niewielki, ale praktycznie nieistotny spadek wydajności .

Mogą jednak .bindzostać usunięte z przyszłych wersji w dowolnym momencie. Nie ma powodu, aby nadal używać .bindi każdy powód, aby preferować .on.

Blazemonger
źródło
5
Prawdopodobnie - nie ma powodu, aby je usuwać, ponieważ mapują one tylko na istniejącą funkcję. Z drugiej strony, aktualizacja o główny numer wersji oznacza, że ​​możesz zrobić prawie wszystko do interfejsu API, ponieważ zgodność wsteczna niekoniecznie jest wówczas gwarantowana. Tylko mówię'.
Blazemonger,
6
@Esailija te funkcje oferują przydatne skróty do obsługi określonych typów żądań asynchronicznych. .bindi .onsą identyczne dla wydarzeń nieprzekazanych; .bindnie zapewnia żadnego rodzaju skrótu jak $.getJSONrobi
jackwanders
7
@jbabey, choć technicznie prawdą jest, że niekoniecznie usuwają one jakiekolwiek funkcje, nadal je wycofują i radzą, aby ich nie używać. W przyszłości zawsze mogą zdecydować o ich całkowitym usunięciu (rodzaj sposobu, w jaki usunęli pewne wsparcie IE od wersji 2.x). Przestarzałe funkcje nie powinny być używane.
Hanna
8
wypisywanie „jQuery.fn.bind.toString ()„ wyjścia ”funkcja (a, b, c) {return this.on (a, null, b, c)}"
Jowen
5
bind i unbind są przestarzałe od jQuery 3.
Joe Mabel
58

Wszystkie te fragmenty działają dokładnie tak samo:

element.on('click', function () { ... });
element.bind('click', function () { ... });
element.click(function () { ... });

Jednak różnią się one bardzo od tych, które wszystkie wykonują to samo:

element.on('click', 'selector', function () { ... });
element.delegate('click', 'selector', function () { ... });
$('selector').live('click', function () { ... });

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).

jbabey
źródło
1
Myślę, że masz na myśli $('selector').live('click', function () { ... });, abyś utrzymał wynik jako możliwie jak najbardziej identyczny.
andlrc
11

Metody bezpośrednie i .delegatesą doskonałymi interfejsami API .oni 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ć clickniżon("click"

.delegateJest lepsza .onz powodu kolejności argument za:

$(elem).delegate( ".selector", {
    click: function() {
    },
    mousemove: function() {
    },
    mouseup: function() {
    },
    mousedown: function() {
    }
});

Od razu wiesz, że jest delegowany, ponieważ, no cóż, mówi delegat. Widoczny jest również selektor.

Nie .onjest od razu jasne, czy jest nawet delegowane, i musisz spojrzeć na koniec selektora:

$(elem).on({
    click: function() {
    },
    mousemove: function() {
    },
    mouseup: function() {
    },
    mousedown: function() {
    }
}, "selector" );

Nazewnictwo .bindjest naprawdę okropne i ma wartość nominalną gorszą niż .on. Ale .delegatenie 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.

Esailija
źródło
8
Począwszy od jQuery 3.0, .delegate () jest przestarzałe.
słabe
6

Z dokumentacji jQuery:

Począwszy od jQuery 1.7, metoda .on () jest preferowaną metodą dołączania procedur obsługi zdarzeń do dokumentu. We wcześniejszych wersjach metoda .bind () służy do dołączania modułu obsługi zdarzeń bezpośrednio do elementów. Programy obsługi są dołączone do aktualnie wybranych elementów w obiekcie jQuery, więc te elementy muszą istnieć w momencie wywołania funkcji .bind (). Aby uzyskać bardziej elastyczne wiązanie zdarzeń, zobacz omówienie delegowania zdarzeń w .on () lub .delegate ().

http://api.jquery.com/bind/

Faust
źródło
1
Pamiętaj, że porady dokumentacji pochodzą od tego samego zespołu, który sprawił, że związałeś, kliknąłeś, opublikowałeś, delegowałeś ... i wszystkie wynikające z tego zamieszanie. Po przeczytaniu wielu stron na ten temat, uważam, że najlepsze i najdokładniejsze strony to te, które opisują „on” jako „powlekanie cukrem”, cukier przyciąga błędy, a delegat jest właściwą drogą.
DaveWalley,
4

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 ()

userG
źródło