$ (dokument) .on ('click', '#id', function () {}) vs $ ('# id'). on ('click', function () {}) [zamknięte]

82

Próbowałem dowiedzieć się, jaka jest różnica między

$(document).on('click', '#id', function(){});

i

$('#id').on('click', function(){});

Nie udało mi się znaleźć żadnych informacji o tym, czy jest jakaś różnica między nimi, a jeśli tak, jaka może być ta różnica.

Czy ktoś może wyjaśnić, czy w ogóle jest jakaś różnica?

Styphon
źródło
2
Czy przeczytałeś dokumentację lub przeszukałeś tę witrynę. Powinno być kilka milionów odpowiedzi do wyboru?
adeneo,
9
Otrzymasz odpowiedź hipopotamów "głodnych punktów", mimo że jest to jasno udokumentowane. Pierwszy kod mówi: „kiedy dokument zostanie kliknięty, jeśli jest to coś o identyfikatorze #id, uruchom ten kod”. Drugi mówi: „kiedy zostanie kliknięte cokolwiek, co obecnie istnieje o identyfikatorze #id, uruchom ten kod”. Pierwsza polega na przypisaniu zdarzenia do elementów, które nie istnieją w tym czasie, ale będą istnieć w przyszłości. Drugi nie odpali dla żadnych elementów dodanych później.
Przywróć Monikę Cellio
6
Zrobiłem jedno i drugie, ale oczywiście nie dość dokładnie. Wyszukiwanie jest trudne, ponieważ nie wiedziałem, czego szukać. Nie wiedziałbym, jak to się nazywa.
Styphon,
1
Jest to wyjaśnione w dokumentacji programu on(). Wystarczy trochę poczytać :)
Przywróć Monikę Cellio
8
Jeśli to powinno zostać zamknięte jako nie konstruktywne lub ponieważ istnieje dla niego dokumentacja, wówczas około 99,9% pytań dotyczących przepełnienia stosu powinno zostać zamkniętych, w takim przypadku powodzenia w znalezieniu pozostałych 0,1%, ponieważ prawdopodobnie wypadłoby to z interesu. To samo dotyczy uwłaczającej uwagi „głodne hipopotamy”.
cesoid

Odpowiedzi:

69

Pierwszy przykład ilustruje delegowanie zdarzeń . Procedura obsługi zdarzenia jest powiązana z elementem znajdującym się wyżej w drzewie DOM (w tym przypadku document) i zostanie wykonana, gdy zdarzenie osiągnie ten element i pochodzi z elementu pasującego do selektora.

Jest to możliwe, ponieważ większość zdarzeń DOM wypływa w górę drzewa z punktu początkowego. Jeśli klikniesz #idelement, zostanie wygenerowane zdarzenie kliknięcia, które przejdzie przez wszystkie elementy przodków ( uwaga na marginesie: tak naprawdę wcześniej jest faza, zwana `` fazą przechwytywania '', kiedy zdarzenie schodzi w docelowy ). Możesz uchwycić wydarzenie na dowolnym z tych przodków.

Drugi przykład wiąże procedurę obsługi zdarzeń bezpośrednio z elementem. Zdarzenie nadal będzie bąbelkowe (chyba że zapobiegniesz temu w module obsługi), ale ponieważ moduł obsługi jest powiązany z celem, nie zobaczysz efektów tego procesu.

Delegując procedurę obsługi zdarzeń, można zapewnić, że zostanie ona wykonana dla elementów, które nie istniały w DOM w momencie wiązania. Jeśli Twój #idelement został utworzony po drugim przykładzie, program obsługi nigdy nie zostałby wykonany. Powiązanie z elementem, o którym wiesz, że znajduje się na pewno w DOM w momencie wykonywania, daje pewność, że procedura obsługi będzie faktycznie do czegoś dołączona i będzie mogła zostać wykonana w razie potrzeby później.

James Allardice
źródło
1
Chciałbym wiedzieć, który szybciej deleguje wydarzenie. Chcę poprawić jakość mojego kodu jQuery. Ponieważ delegowanie zdarzenia z DOM zajmuje trochę czasu niż delegowanie zdarzenia z #Element. Podziel się swoimi przemyśleniami
Arun G,
1
@James Allardice - używając tej drugiej metody, $(document).on('click', $('#id'), function()...jak mogę użyć $(this)odniesienia $('#id')? $(this)aktualnie odwołuje się document- co rozumiem.
cheshireoctopus
13

Rozważ następujący kod

<ul id="myTask">
  <li>Coding</li>
  <li>Answering</li>
  <li>Getting Paid</li>
</ul>

Oto różnica

// Remove the myTask item when clicked.
$('#myTask').children().click(function () {
  $(this).remove()
});

A co, jeśli ponownie dodamy myTask?

$('#myTask').append('<li>Answer this question on SO</li>');

Kliknięcie tego elementu myTask nie spowoduje usunięcia go z listy, ponieważ nie ma związanych z nim żadnych procedur obsługi zdarzeń. Gdybyśmy zamiast tego użyli .on, nowy element działałby bez dodatkowego wysiłku z naszej strony. Oto jak wyglądałaby wersja .on:

$('#myTask').on('click', 'li', function (event) {
  $(event.target).remove()
});

Podsumowanie:

Różnica między .on()i .click()może polegać na tym, że .click()może nie działać, gdy elementy DOM powiązane ze .click()zdarzeniem są dodawane dynamicznie w późniejszym czasie, podczas gdy .on()może być używane w sytuacjach, gdy elementy DOM powiązane z .on()wywołaniem mogą być generowane dynamicznie w późniejszym czasie.

Bhushan Firake
źródło
Bhushan, czy jest jakiś powód, by używać tego pierwszego, a nie drugiego?
Sean Magyar
@SzilardMagyar Chyba odpowiedziałem, że w sekcji Podsumowanie mojej odpowiedzi ..
Bhushan Firake
Dobra informacja!
Abdul Aziz Al Basyir