Термінологія
З сайту 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функції ... Також дивно, я ніколи з цим не мав проблем. Я багато використовую барботаж. Дякую за приклад!