В 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, и их понимание помогает вам контролировать обработку событий в ваших веб-приложениях.