Terminologia
Z quirksmode.org :
Przechwytywanie zdarzeń
Gdy używasz przechwytywania zdarzeń
| |
--------------- | | -----------------
| element1 | | |
| ----------- | | ----------- |
| | element2 \ / | |
| ------------------------- |
| PRZECHOWYWANIE ZDARZEŃ |
-----------------------------------
moduł obsługi zdarzeń elementu 1 uruchamia się jako pierwszy, moduł obsługi zdarzeń elementu 2 jest uruchamiany jako ostatni.
Bulgotanie zdarzeń
Gdy używasz propagacji zdarzeń
/ \
--------------- | | -----------------
| element1 | | |
| ----------- | | ----------- |
| | element2 | | | |
| ------------------------- |
| Wydarzenie BUBBLING |
-----------------------------------
moduł obsługi zdarzeń elementu 2 uruchamia się jako pierwszy, moduł obsługi zdarzeń elementu 1 uruchamia się jako ostatni.
Każde zdarzenie mające miejsce w modelu zdarzenia W3C jest najpierw rejestrowane, aż dotrze do elementu docelowego, a następnie ponownie pęka .
| | / \
----------------- | | - | | -----------------
| element1 | | | | |
| ------------- | | - | | ----------- |
| | element2 \ / | | | |
| -------------------------------- |
| Model zdarzenia W3C |
------------------------------------------
Berło
Z w3.org , do przechwytywania zdarzeń :
Jeśli przechwytywanie EventListenerchce zapobiec dalszemu przetwarzaniu zdarzenia, może wywołać stopPropagationmetodę
Eventinterfejsu. Zapobiegnie to dalszemu wysyłaniu zdarzenia, chociaż dodatkowe osoby EventListenerszarejestrowane na tym samym poziomie hierarchii nadal będą je otrzymywać. Po wywołaniu stopPropagation
metody zdarzenia kolejne wywołania tej metody nie mają dodatkowego efektu. Jeśli nie istnieją żadne dodatkowe programy przechwytujące i
stopPropagationnie zostały one wywołane, zdarzenie wyzwala odpowiedni obiekt EventListenersdocelowy.
W przypadku propagacji zdarzeń :
Każdy moduł obsługi zdarzeń może uniemożliwić dalszą propagację zdarzeń, wywołując stopPropagationmetodę Eventinterfejsu. Jeśli którakolwiek z
EventListenertych metod zostanie wywołana , wszystkie dodatkowe EventListenersna prądzie EventTargetzostaną wyzwolone, ale bulgotanie ustanie na tym poziomie. Tylko jeden telefon stopPropagationjest wymagany, aby zapobiec dalszemu bulgotaniu.
Aby anulować wydarzenie :
Anulowanie odbywa się przez wywołanie Event„s preventDefault
metody. Jeśli jedno lub więcej EventListenerswywołań preventDefaultpodczas dowolnej fazy przepływu zdarzeń, działanie domyślne zostanie anulowane.
Przykłady
W poniższych przykładach kliknięcie hiperłącza w przeglądarce internetowej uruchamia przepływ zdarzenia (detektory zdarzeń są wykonywane) i domyślną akcję celu zdarzenia (otwiera się nowa karta).
HTML:
<div id="a">
<a id="b" href="http://www.google.com/" target="_blank">Google</a>
</div>
<p id="c"></p>
JavaScript:
var el = document.getElementById("c");
function capturingOnClick1(ev) {
el.innerHTML += "DIV event capture<br>";
}
function capturingOnClick2(ev) {
el.innerHTML += "A event capture<br>";
}
function bubblingOnClick1(ev) {
el.innerHTML += "DIV event bubbling<br>";
}
function bubblingOnClick2(ev) {
el.innerHTML += "A event bubbling<br>";
}
// The 3rd parameter useCapture makes the event listener capturing (false by default)
document.getElementById("a").addEventListener("click", capturingOnClick1, true);
document.getElementById("b").addEventListener("click", capturingOnClick2, true);
document.getElementById("a").addEventListener("click", bubblingOnClick1, false);
document.getElementById("b").addEventListener("click", bubblingOnClick2, false);
Przykład 1 : daje wynik
DIV event capture
A event capture
A event bubbling
DIV event bubbling
Przykład 2 : dodanie stopPropagation()do funkcji
function capturingOnClick1(ev) {
el.innerHTML += "DIV event capture<br>";
ev.stopPropagation();
}
daje wynik
DIV event capture
Detektor zdarzeń uniemożliwił dalszą propagację zdarzenia w dół i w górę. Nie zapobiegło to jednak domyślnej akcji (otwarcie nowej karty).
Przykład 3 : dodanie stopPropagation()do funkcji
function capturingOnClick2(ev) {
el.innerHTML += "A event capture<br>";
ev.stopPropagation();
}
lub funkcja
function bubblingOnClick2(ev) {
el.innerHTML += "A event bubbling<br>";
ev.stopPropagation();
}
daje wynik
DIV event capture
A event capture
A event bubbling
Jest tak, ponieważ oba detektory zdarzeń są zarejestrowane w tym samym celu zdarzenia. Detektory zdarzeń uniemożliwiły dalszą propagację zdarzenia w górę. Nie zapobiegły one jednak domyślnej akcji (otwarcie nowej karty).
Przykład 4 : na przykład dodanie preventDefault()do dowolnej funkcji
function capturingOnClick1(ev) {
el.innerHTML += "DIV event capture<br>";
ev.preventDefault();
}
zapobiega otwieraniu nowej karty.
event.stoppełnią obie funkcje ... Dziwne, że nigdy nie miałem z tym problemu. Często używam bulgotania. Dzięki za przykład!