Термінологія
З сайту quirksmode.org :
Захоплення події
Коли ви використовуєте захоплення подій
| |
--------------- | | -----------------
| елемент1 | | |
| ----------- | | ----------- |
| | елемент2 \ / | |
| ------------------------- |
| CAPTURING події |
-----------------------------------
спочатку спрацьовує обробник події element1, останній обробник події елемента2.
Подія кипіла
Під час використання подій
/ \
--------------- | | -----------------
| елемент1 | | |
| ----------- | | ----------- |
| | елемент2 | | | |
| ------------------------- |
| Подія BUBBLING |
-----------------------------------
спочатку запускається обробник події елемента2, обробляється подія елементу1.
Будь-яка подія, яка відбувається в моделі подій W3C, спочатку фіксується, поки не досягне цільового елемента, а потім знову роздується .
| | / \
----------------- | | - | | -----------------
| елемент1 | | | | |
| ------------- | | - | | ----------- |
| | елемент2 \ / | | | |
| -------------------------------- |
| Модель подій 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
функції ... Також дивно, я ніколи з цим не мав проблем. Я багато використовую барботаж. Дякую за приклад!