Chciałbym dodać kilka uwag i kontrargumentów do odpowiedzi jfriend00. (głównie moje opinie oparte na moich przeczuciach)
Nie - NIE należy wiązać wszystkich delegowanych programów obsługi zdarzeń z obiektem dokumentu. To prawdopodobnie najgorszy scenariusz, jaki można stworzyć.
Po pierwsze, delegowanie zdarzeń nie zawsze przyspiesza kod. W niektórych przypadkach jest to korzystne, aw niektórych nie. Z delegowania zdarzeń należy korzystać, gdy faktycznie jest potrzebne delegowanie zdarzeń i gdy jest to korzystne. W przeciwnym razie należy powiązać programy obsługi zdarzeń bezpośrednio z obiektami, w których ma miejsce zdarzenie, ponieważ zazwyczaj będzie to bardziej wydajne.
Chociaż prawdą jest, że wydajność może być nieco lepsza, jeśli zamierzasz zarejestrować i zdarzenie tylko dla jednego elementu, uważam, że nie jest to sprzeczne z korzyściami skalowalności, jakie przynosi delegowanie. Uważam również, że przeglądarki coraz wydajniej sobie z tym radzą, chociaż nie mam na to dowodów. Moim zdaniem delegacja na imprezy to droga!
Po drugie, NIE powinieneś wiązać wszystkich delegowanych wydarzeń na poziomie dokumentu. Właśnie dlatego .live () został uznany za przestarzały, ponieważ jest bardzo nieefektywny, gdy w ten sposób jest powiązanych wiele zdarzeń. W przypadku obsługi zdarzeń delegowanych DUŻO bardziej efektywne jest powiązanie ich z najbliższym rodzicem, który nie jest dynamiczny.
W pewnym sensie się z tym zgadzam. Jeśli masz 100% pewności, że zdarzenie będzie miało miejsce tylko w kontenerze, sensowne jest powiązanie zdarzenia z tym kontenerem, ale nadal będę spierał się przeciwko powiązaniu zdarzeń bezpośrednio z elementem wyzwalającym.
Po trzecie, nie wszystkie zdarzenia działają lub wszystkie problemy można rozwiązać za pomocą delegacji. Na przykład, jeśli chcesz przechwycić kluczowe zdarzenia w kontrolce wejściowej i zablokować wprowadzanie nieprawidłowych kluczy do kontrolki wejściowej, nie możesz tego zrobić z delegowaną obsługą zdarzeń, ponieważ do czasu, gdy zdarzenie przechodzi do delegowanej procedury obsługi, już ma zostały przetworzone przez kontrolkę wejściową i jest już za późno, aby wpłynąć na to zachowanie.
To po prostu nieprawda. Zobacz ten kodPen: https://codepen.io/pwkip/pen/jObGmjq
document.addEventListener('keypress', (e) => {
e.preventDefault();
});
Pokazuje, jak można zapobiec wpisywaniu przez użytkownika, rejestrując zdarzenie naciśnięcia klawisza w dokumencie.
Oto sytuacje, w których delegowanie zdarzeń jest wymagane lub korzystne:
Gdy obiekty, na których przechwytujesz zdarzenia, są dynamicznie tworzone / usuwane i nadal chcesz przechwytywać na nich zdarzenia bez konieczności jawnego ponownego wiązania programów obsługi zdarzeń za każdym razem, gdy tworzysz nowy. Gdy masz wiele obiektów, z których wszystkie wymagają dokładnie tego samego modułu obsługi zdarzeń (gdzie partie to co najmniej setki). W takim przypadku bardziej wydajne może być w czasie konfiguracji powiązanie jednego delegowanego programu obsługi zdarzeń zamiast setek lub więcej bezpośrednich programów obsługi zdarzeń. Uwaga: delegowana obsługa zdarzeń jest zawsze mniej wydajna w czasie wykonywania niż bezpośrednia obsługa zdarzeń.
Chciałbym odpowiedzieć tym cytatem z https://ehsangazar.com/optimizing-javascript-event-listeners-for-performance-e28406ad406c
Event delegation promotes binding as few DOM event handlers as possible, since each event handler requires memory. For example, let’s say that we have an HTML unordered list we want to bind event handlers to. Instead of binding a click event handler for each list item (which may be hundreds for all we know), we bind one click handler to the parent unordered list itself.
Ponadto performance cost of event delegation google
wyszukiwanie w Google zwraca więcej wyników na korzyść delegowania wydarzeń.
Kiedy próbujesz uchwycić (na wyższym poziomie w dokumencie) zdarzenia, które występują w dowolnym elemencie w dokumencie. Gdy Twój projekt wyraźnie używa propagacji zdarzeń i metody stopPropagation () w celu rozwiązania problemu lub funkcji na stronie. Aby lepiej to zrozumieć, należy zrozumieć, jak działają procedury obsługi zdarzeń delegowanych w jQuery. Kiedy zadzwonisz do czegoś takiego:
$ ("# myParent"). on ('click', 'button.actionButton', myFn); Instaluje ogólny program obsługi zdarzeń jQuery na obiekcie #myParent. Gdy zdarzenie kliknięcia przechodzi do tej delegowanej procedury obsługi zdarzeń, jQuery musi przejść przez listę delegowanych programów obsługi zdarzeń dołączonych do tego obiektu i sprawdzić, czy element źródłowy zdarzenia pasuje do któregokolwiek z selektorów w delegowanych programach obsługi zdarzeń.
Ponieważ selektory mogą być dość zaangażowane, oznacza to, że jQuery musi przeanalizować każdy selektor, a następnie porównać go z charakterystyką oryginalnego celu zdarzenia, aby sprawdzić, czy pasuje do każdego selektora. To nie jest tania operacja. To nic wielkiego, jeśli jest tylko jeden z nich, ale jeśli umieścisz wszystkie selektory na obiekcie dokumentu, a były setki selektorów do porównania z każdym pojedynczym zdarzeniem, może to poważnie pogorszyć wydajność obsługi zdarzeń.
Z tego powodu chcesz skonfigurować delegowane programy obsługi zdarzeń, aby delegowana procedura obsługi zdarzeń była jak najbliżej obiektu docelowego. Oznacza to, że mniej zdarzeń będzie przechodzić przez każdą delegowaną procedurę obsługi zdarzeń, poprawiając w ten sposób wydajność. Umieszczanie wszystkich delegowanych zdarzeń w obiekcie dokumentu to najgorsza możliwa wydajność, ponieważ wszystkie zdarzenia propagowane muszą przejść przez wszystkie delegowane programy obsługi zdarzeń i zostać ocenione względem wszystkich możliwych delegowanych selektorów zdarzeń. Właśnie dlatego .live () jest przestarzała, ponieważ tak właśnie zrobiła .live () i okazała się bardzo nieefektywna.
Gdzie to jest udokumentowane? Jeśli to prawda, to jQuery wydaje się obsługiwać delegowanie w bardzo nieefektywny sposób, a wtedy moje kontrargumenty powinny być stosowane tylko do waniliowego JS.
Mimo to: chciałbym znaleźć oficjalne źródło wspierające to twierdzenie.
:: EDYTOWAĆ ::
Wygląda na to, że jQuery rzeczywiście robi propagację zdarzeń w bardzo nieefektywny sposób (ponieważ obsługuje IE8)
https://api.jquery.com/on/#event-performance
Tak więc większość moich argumentów odnosi się tylko do klasycznego JS i nowoczesnych przeglądarek.