Вебсправочник
Ваш первый сайт

Урок: проследить всплытие одного события

Одно нажатие может вызвать обработчики на кнопке и на её родителе. Урок помогает отличить нормальное всплытие от случайной повторной регистрации одинакового обработчика.

Назначение

Одно нажатие может вызвать обработчики на кнопке и на её родителе. Урок помогает отличить нормальное всплытие от случайной повторной регистрации одинакового обработчика.

Как это работает

Создайте div id event-box и внутри кнопку id event-button. Подключите код после разметки. Оба обработчика используют обычную фазу всплытия, а capture-наблюдатель на родителе записывает начало прохода.

Пример

const box = document.querySelector("#event-box");
const button = document.querySelector("#event-button");
box.addEventListener("click", () => console.log("1: захват на контейнере"), true);
button.addEventListener("click", () => console.log("2: кнопка"));
box.addEventListener("click", () => console.log("3: всплытие на контейнере"));

Что должно получиться

При одном нажатии на кнопку сообщения идут в порядке 1, 2, 3. Это три разных обработчика одного события, а не три отдельных нажатия. Щелчок по свободной области контейнера не вызывает обработчик кнопки.

Граница применения и частая ошибка

Не добавляйте stopPropagation автоматически для устранения непонятных сообщений: это может сломать делегирование выше по дереву. PreventDefault отменяет действие по умолчанию, а не распространение. Если код запускается повторно в консоли, обновите страницу перед чистой проверкой.

Самостоятельная проверка

Сравните мышь и клавиатурную активацию кнопки. Затем в копии добавьте остановку распространения на кнопке и запишите изменение порядка. Объясните, почему уже отработавшая фаза захвата не отменяется.

Самостоятельный учебный материал. Техническая документация: первоисточник по теме ↗. Если результат отличается, проверьте код и версию браузера.