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 EventListener
chce zapobiec dalszemu przetwarzaniu zdarzenia, może wywołać stopPropagation
metodę
Event
interfejsu. Zapobiegnie to dalszemu wysyłaniu zdarzenia, chociaż dodatkowe osoby EventListeners
zarejestrowane 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
stopPropagation
nie zostały one wywołane, zdarzenie wyzwala odpowiedni obiekt EventListeners
docelowy.
W przypadku propagacji zdarzeń :
Każdy moduł obsługi zdarzeń może uniemożliwić dalszą propagację zdarzeń, wywołując stopPropagation
metodę Event
interfejsu. Jeśli którakolwiek z
EventListener
tych metod zostanie wywołana , wszystkie dodatkowe EventListeners
na prądzie EventTarget
zostaną wyzwolone, ale bulgotanie ustanie na tym poziomie. Tylko jeden telefon stopPropagation
jest wymagany, aby zapobiec dalszemu bulgotaniu.
Aby anulować wydarzenie :
Anulowanie odbywa się przez wywołanie Event
„s preventDefault
metody. Jeśli jedno lub więcej EventListeners
wywołań preventDefault
podczas 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.stop
pełnią obie funkcje ... Dziwne, że nigdy nie miałem z tym problemu. Często używam bulgotania. Dzięki za przykład!