
В JavaScript распространение событий включает две фазы: фазу захвата и фазу всплытия. Эти фазы определяют порядок, в котором срабатывают обработчики событий, когда событие происходит во вложенном элементе DOM. Давайте рассмотрим каждый этап на примере:
Фаза всплытия. На этапе всплывания событие начинается с целевого элемента, который инициировал событие, а затем распространяется через его родительские элементы в дереве DOM. Обработчики событий родительских элементов вызываются по порядку от целевого элемента до корня документа.
<!DOCTYPE html>
<html>
<head>
<style>
div {
width: 100px;
height: 100px;
border: 1px solid black;
}
</style>
</head>
<body>
<div id="outer">
<div id="middle">
<div id="inner">Click me!</div>
</div>
</div>
<script>
document.getElementById('outer').addEventListener('click', () => {
console.log('Outer Div Clicked');
});
document.getElementById('middle').addEventListener('click', () => {
console.log('Middle Div Clicked');
});
document.getElementById('inner').addEventListener('click', () => {
console.log('Inner Div Clicked');
});
</script>
</body>
</html>
Если вы нажмете «Inner Div», вы увидите следующий вывод в консоли:
Inner Div Clicked Middle Div Clicked Outer Div Clicked
Это связано с тем, что событие щелчка сначала срабатывает на самом внутреннем элементе, а затем распространяется на внешние элементы в порядке вложенности.
Фаза захвата. На этапе захвата событие перемещается вниз по дереву DOM от корневого элемента к целевому элементу. Эта фаза используется реже, чем фаза барботирования.
document.getElementById('outer').addEventListener('click', () => {
console.log('Outer Div Clicked - Capturing');
}, true); // true indicates capturing phase
document.getElementById('middle').addEventListener('click', () => {
console.log('Middle Div Clicked - Capturing');
}, true);
document.getElementById('inner').addEventListener('click', () => {
console.log('Inner Div Clicked - Capturing');
}, true);
При наличии обработчиков фазы захвата нажатие на «Inner Div» приведет к следующему выводу:
Outer Div Clicked - Capturing Middle Div Clicked - Capturing Inner Div Clicked - Capturing
Фазу захвата можно установить, передав true в качестве третьего аргумента функции addEventListener. По умолчанию прослушиватели событий находятся на этапе воспламенения.
Фазы всплытия и захвата являются частью модели распространения событий в DOM, и их понимание помогает вам контролировать обработку событий в ваших веб-приложениях.