терминология
С quirksmode.org :
Захват событий
Когда вы используете захват событий
| |
--------------- | | -----------------
| element1 | | |
| ----------- | | ----------- |
| | element2 \ / | |
| ------------------------- |
| Событие ЗАХВАТ |
-----------------------------------
обработчик события element1 срабатывает первым, обработчик события element2 срабатывает последним.
Событие кипит
Когда вы используете всплывающее событие
/ \
--------------- | | -----------------
| element1 | | |
| ----------- | | ----------- |
| | element2 | | | |
| ------------------------- |
| Событие BUBBLING |
-----------------------------------
обработчик события element2 срабатывает первым, обработчик события element1 срабатывает последним.
Любое событие, происходящее в модели событий W3C, сначала фиксируется до достижения целевого элемента, а затем снова всплывает .
| | / \
----------------- | | - | | -----------------
| element1 | | | | |
| ------------- | | - | | ----------- |
| | element2 \ / | | | |
| -------------------------------- |
| Модель событий W3C |
------------------------------------------
Интерфейс
С w3.org , для захвата событий :
Если захват EventListener
хочет предотвратить дальнейшую обработку события, он может вызвать stopPropagation
метод
Event
интерфейса. Это предотвратит дальнейшую отправку события, хотя дополнительное EventListeners
зарегистрированное на том же уровне иерархии все еще получит событие. После stopPropagation
вызова метода события дальнейшие вызовы этого метода не имеют никакого дополнительного эффекта. Если никаких дополнительных захватчиков не существует и
stopPropagation
они не были вызваны, событие вызывает соответствующую EventListeners
цель на самой цели.
Для всплытия событий :
Любой обработчик события может решить предотвратить дальнейшее распространение события, вызвав stopPropagation
метод Event
интерфейса. Если какой-либо
EventListener
вызов этого метода, все дополнительные EventListeners
на текущем EventTarget
будет вызван, но пузырьки прекратятся на этом уровне. stopPropagation
Требуется только один вызов для предотвращения дальнейшего пузырения.
Для отмены мероприятия :
Отмены осуществляются путем вызова Event
«S preventDefault
метода. Если один или несколько EventListeners
вызовов preventDefault
во время любой фазы потока событий, действие по умолчанию будет отменено.
Примеры
В следующих примерах щелчок по гиперссылке в веб-браузере запускает поток события (слушатели события выполняются) и действие по умолчанию для цели события (открывается новая вкладка).
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);
Пример 1 : это приводит к выводу
DIV event capture
A event capture
A event bubbling
DIV event bubbling
Пример 2 : добавление stopPropagation()
в функцию
function capturingOnClick1(ev) {
el.innerHTML += "DIV event capture<br>";
ev.stopPropagation();
}
результаты в выводе
DIV event capture
Слушатель события предотвратил дальнейшее распространение события вниз и вверх. Однако это не помешало действию по умолчанию (открытие новой вкладки).
Пример 3 : добавление stopPropagation()
в функцию
function capturingOnClick2(ev) {
el.innerHTML += "A event capture<br>";
ev.stopPropagation();
}
или функция
function bubblingOnClick2(ev) {
el.innerHTML += "A event bubbling<br>";
ev.stopPropagation();
}
результаты в выводе
DIV event capture
A event capture
A event bubbling
Это связано с тем, что оба прослушивателя событий зарегистрированы на одной и той же цели. Слушатели события предотвратили дальнейшее распространение события вверх. Однако они не помешали действию по умолчанию (открытие новой вкладки).
Пример 4 : добавление preventDefault()
к любой функции, например
function capturingOnClick1(ev) {
el.innerHTML += "DIV event capture<br>";
ev.preventDefault();
}
предотвращает открытие новой вкладки.
event.stop
функции ... Также странно, у меня никогда не было проблем с этим. Я часто использую пузырьки. Спасибо за пример!