← Назад к вопросам

Что такое Event Propagation?

1.7 Middle🔥 161 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Event Propagation (Всплытие и Погружение событий)?

Event Propagation (распространение событий) — это механизм в DOM, который определяет порядок обработки событий при их возникновении на элементах веб-страницы. Когда происходит событие (например, клик), оно не просто срабатывает на целевом элементе, а проходит через три фазы, позволяя обработать его на разных уровнях иерархии DOM.

Три фазы распространения событий:

  1. Фаза погружения (Capture Phase)
    Событие движется от корня документа (window) вниз по иерархии DOM до целевого элемента. На этой фазе можно перехватить событие до того, как оно достигнет цели.

  2. Фаза цели (Target Phase)
    Событие достигает целевого элемента, на котором произошло действие (например, кнопки, на которую кликнули).

  3. Фаза всплытия (Bubble Phase)
    Событие поднимается от целевого элемента вверх по иерархии DOM к корню документа. Это поведение по умолчанию для большинства событий.

Практический пример

Рассмотрим простую HTML-структуру:

<div id="parent">
  <button id="child">Кликни меня</button>
</div>
const parent = document.getElementById('parent');
const child = document.getElementById('child');

// Обработчик на фазе погружения (третий параметр true)
parent.addEventListener('click', () => {
  console.log('Захват: родитель');
}, true);

// Обработчик на фазе всплытия (третий параметр false или опущен)
parent.addEventListener('click', () => {
  console.log('Всплытие: родитель');
}, false);

child.addEventListener('click', () => {
  console.log('Цель: кнопка');
});

При клике на кнопку вывод в консоли будет:

Захват: родитель
Цель: кнопка
Всплытие: родитель

Управление распространением событий

  • event.stopPropagation() — останавливает дальнейшее распространение события на текущей фазе. Например, если вызвать его в обработчике на фазе захвата, событие не достигнет целевого элемента.
  • event.stopImmediatePropagation() — полностью останавливает распространение и предотвращает вызов других обработчиков на том же элементе.
  • event.preventDefault() — отменяет стандартное действие браузера (например, переход по ссылке), но не влияет на распространение события.

Важные особенности

  • Делегирование событий — популярный паттерн, использующий всплытие. Вместо назначения обработчиков множеству элементов, один обработчик вешается на общего предка:
document.getElementById('list').addEventListener('click', (event) => {
  if (event.target.tagName === 'LI') {
    console.log('Кликнут элемент списка:', event.target.textContent);
  }
});
  • Не все события всплывают — события focus, blur, load, unload и некоторые другие не всплывают. Для них нужно использовать фазу захвата или альтернативные методы.
  • Третьим параметром addEventListener можно управлять фазой: true — захват, false — всплытие (по умолчанию).

Зачем это нужно?

  1. Эффективность — делегирование событий снижает количество обработчиков и потребление памяти.
  2. Гибкость — можно перехватывать события на разных уровнях для реализации сложной логики (например, модальные окна, валидация форм).
  3. Контроль — возможность прерывать обработку в нужный момент.

Понимание Event Propagation критически важно для создания интерактивных веб-приложений без ошибок в обработке пользовательских действий, особенно в сложных интерфейсах с вложенными компонентами.

Что такое Event Propagation? | PrepBro