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

Какие знаешь стадии распространения событий по DOM дереву?

2.0 Middle🔥 191 комментариев
#JavaScript Core

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

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

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

Стадии распространения событий в DOM

В современной DOM-модели события распространяются по трем четко определенным стадиям, что обеспечивает гибкость и контроль над обработкой пользовательских взаимодействий. Понимание этого механизма критически важно для создания сложных интерактивных интерфейсов.

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

1. Фаза захвата (Capture Phase)

Событие движется сверху вниз — от корневого элемента (window) к целевому элементу (target). На этой стадии используются обработчики, зарегистрированные с третьим параметром true в addEventListener.

element.addEventListener('click', handler, true);
// или {capture: true}
element.addEventListener('click', handler, {capture: true});

Ключевые особенности:

  • Редко используется на практике, но полезна для перехвата событий до достижения цели
  • Позволяет реализовать глобальные обработчики или системы контроля событий
  • Событие проходит через всех предков целевого элемента

2. Фаза цели (Target Phase)

Событие достигает целевого элемента, на котором произошло инициирующее действие (клик, наведение и т.д.). Здесь срабатывают все обработчики, назначенные непосредственно на этот элемент, независимо от фазы их регистрации.

// Оба обработчика сработают на фазе цели
button.addEventListener('click', handler1, false); // bubbling
button.addEventListener('click', handler2, true);  // capture

Важный нюанс: Порядок вызова обработчиков на целевом элементе зависит от порядка их регистрации, а не от указанной фазы.

3. Фаза всплытия (Bubbling Phase)

Событие поднимается снизу вверх — от целевого элемента обратно к корню документа. Это наиболее часто используемая фаза, которая является поведением по умолчанию для большинства событий.

// Оба варианта регистрируют обработчик на фазе всплытия
element.addEventListener('click', handler); // по умолчанию false
element.addEventListener('click', handler, false);

Практическое применение и управление

Делегирование событий — мощный паттерн, основанный на всплытии:

// Один обработчик на родителе вместо множества на дочерних элементах
document.querySelector('.list').addEventListener('click', (event) => {
    if (event.target.matches('.list-item')) {
        console.log('Кликнут элемент списка:', event.target.textContent);
    }
});

Управление распространением:

  • event.stopPropagation() — останавливает дальнейшее распространение события
  • event.stopImmediatePropagation() — также предотвращает вызов других обработчиков на этом же элементе
  • event.preventDefault() — отменяет стандартное поведение браузера (не влияет на распространение)
element.addEventListener('click', (event) => {
    event.stopPropagation(); // Событие не пойдет дальше
    event.preventDefault();  // Отменяет действие по умолчанию
});

Особые случаи и исключения

Некоторые события не всплывают: focus, blur, load, unload, mouseenter, mouseleave. Для них нужно использовать фазой захвата или альтернативные события (focusin/focusout вместо focus/blur).

Современный API: Вместо булевого третьего параметра рекомендуется использовать объект options:

element.addEventListener('click', handler, {
    capture: false,    // фаза обработки
    once: true,        // автоматическое удаление после срабатывания
    passive: true      // оптимизация для скролла
});

Понимание всех трех фаз распространения событий позволяет:

  1. Эффективно реализовывать делегирование событий
  2. Создавать сложные системы обработки пользовательского ввода
  3. Избегать конфликтов обработчиков в крупных приложениях
  4. Оптимизировать производительность за счет сокращения числа обработчиков

Этот механизм является фундаментальным для работы современных веб-приложений и обеспечивает предсказуемое поведение даже в самых сложных UI-компонентах.

Какие знаешь стадии распространения событий по DOM дереву? | PrepBro