Jaka jest różnica między propagacją zdarzeń a przechwytywaniem? Kiedy należy używać bulgotania zamiast chwytania?
javascript
dom-events
event-bubbling
Arun P. Johny
źródło
źródło
Odpowiedzi:
Tworzenie i przechwytywanie zdarzeń to dwa sposoby propagacji zdarzeń w interfejsie API HTML DOM, gdy zdarzenie występuje w elemencie w innym elemencie, a oba elementy zarejestrowały uchwyt dla tego zdarzenia. Tryb propagacji zdarzeń określa, w jakiej kolejności elementy odbierają zdarzenie .
Dzięki propagacji zdarzenie jest najpierw przechwytywane i obsługiwane przez najbardziej wewnętrzny element, a następnie propagowane do elementów zewnętrznych.
W przypadku przechwytywania zdarzenie jest najpierw przechwytywane przez najbardziej zewnętrzny element i propagowane do elementów wewnętrznych.
Przechwytywanie jest również nazywane „zraszaniem”, co pomaga zapamiętać kolejność propagacji:
W dawnych czasach Netscape opowiadał się za przechwytywaniem zdarzeń, podczas gdy Microsoft promował propagowanie zdarzeń. Oba są częścią standardu W3C Document Object Model Events (2000).
IE <9 używa tylko propagacji zdarzeń , podczas gdy IE9 + i wszystkie główne przeglądarki obsługują oba. Z drugiej strony wydajność propagacji zdarzeń może być nieco niższa w przypadku złożonych DOM.
Możemy użyć
addEventListener(type, listener, useCapture)
do zarejestrowania programów obsługi zdarzeń w trybie propagacji (domyślnie) lub przechwytywania. Aby użyć modelu przechwytywania, przekaż trzeci argument jakotrue
.Przykład
Załóżmy, że w powyższej strukturze zdarzenie kliknięcia wystąpiło w
li
elemencie.W uchwycenie modelu, wydarzenie będzie obsługiwane przez
div
pierwszych (obsługi zdarzeń kliknij wdiv
błyśnie pierwsza), a następnie wul
, a następnie w ostatniej w elemencie docelowymli
.W modelu z bąbelkami stanie się odwrotnie: zdarzenie będzie najpierw obsługiwane przez
li
, a następnie przezul
, a na końcu przezdiv
element.Aby uzyskać więcej informacji, zobacz
W poniższym przykładzie kliknięcie dowolnego z wyróżnionych elementów powoduje, że najpierw następuje faza przechwytywania przepływu propagacji zdarzeń, a następnie faza propagacji.
Kolejny przykład w JSFiddle .
źródło
useCapture
teraz obsługiwane w IE> = 9. sourcetriclkling
to samo cocapturing
? Crockforda opowiada oTrickling v. Bubbling
tej rozmowie wideo - youtube.com/watch?v=Fv9qT9joc0M&list=PL7664379246A246CB wokół1 hr 5 minutes
.trickle down
=>onElement
=>bubble up
Opis:
quirksmode.org ma ładny opis tego. W skrócie (skopiowane z quirksmode):
Czego używać?
To zależy od tego, co chcesz zrobić. Nie ma nic lepszego. Różnica polega na kolejności wykonywania procedur obsługi zdarzeń. Przez większość czasu będzie dobrze strzelać do programów obsługi zdarzeń w fazie bulgotania, ale może być również konieczne wcześniejsze ich zwolnienie.
źródło
Jeśli są dwa elementy, element 1 i element 2. Element 2 znajduje się wewnątrz elementu 1 i dołączamy moduł obsługi zdarzeń z oboma elementami, powiedzmy onClick. Teraz, gdy klikniemy element 2, wówczas zostanie wykonany eventHandler dla obu elementów. Teraz pytanie brzmi, w jakiej kolejności wydarzenie zostanie wykonane. Jeśli zdarzenie dołączone do elementu 1 wykonuje się jako pierwsze, nazywa się to przechwytywaniem zdarzenia, a jeśli zdarzenie dołączone do elementu 2 wykonuje się jako pierwsze, nazywane jest to propagowaniem zdarzeń. Zgodnie z W3C zdarzenie rozpocznie się w fazie przechwytywania, dopóki nie osiągnie celu, wraca do elementu, a następnie zaczyna bulgotać
Stany przechwytywania i propagacji są znane z parametru useCapture metody addEventListener
Domyślnie useCapture ma wartość false. Oznacza to, że jest w fazie bulgotania.
Spróbuj zmienić prawdę i fałsz.
źródło
the event will start in the capturing phase untill it reaches the target comes back to the element and then it starts bubbling
. Znalazłem tylko, że addEventListener ma parametr,useCapture
który można ustawić na true lub false; aw HTML 4.0 detektory zdarzeń zostały określone jako atrybuty elementu iuseCapture defaults to false
. Czy możesz link do specyfikacji, która potwierdza to, co napisałeś?Znalazłem ten samouczek na javascript.info, który bardzo jasno wyjaśnia ten temat. A jego 3-punktowe podsumowanie na końcu naprawdę mówi o kluczowych punktach. Cytuję to tutaj:
źródło
Istnieje również
Event.eventPhase
właściwość, która może ci powiedzieć, czy wydarzenie jest docelowe lub pochodzi z innego miejsca.Pamiętaj, że zgodność przeglądarki nie jest jeszcze ustalona. Testowałem go na Chrome (66.0.3359.181) i Firefox (59.0.3) i jest tam obsługiwany.
Po rozwinięciu i tak już świetnego fragmentu z zaakceptowanej odpowiedzi jest to wynik wykorzystujący
eventPhase
właściwośćźródło
Bulgotanie
Przechwytywanie
źródło