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

Обработчик события: поймать повторное подключение

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

Назначение

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

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

Для снятия обработчика нужна ссылка на соответствующую функцию и совпадение режима capture. Новый вызов с другой анонимной функцией не указывает на ранее зарегистрированный обработчик. Подключение стоит выполнять в понятном месте жизненного цикла.

Пример

const button = document.querySelector("#demo-action");
function reportClick() { console.count("Учебное нажатие"); }
if (button) {
  button.addEventListener("click", reportClick);
  button.addEventListener("click", reportClick);
  // Для прекращения наблюдения используйте эту же функцию:
  // button.removeEventListener("click", reportClick);
}

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

На странице с кнопкой demo-action два одинаковых добавления при этих параметрах не создают два независимых обработчика. Нажатие увеличивает счётчик один раз. Другие обработчики страницы этим примером не удаляются.

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

Две внешне одинаковые стрелочные функции — разные объекты функций. Если кнопка заменена новым DOM-узлом, обработчик старого узла не переносится автоматически. Не путайте проблему регистрации с всплытием события через родителей.

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

Создайте отдельную кнопку type="button" с нужным id. Сравните повторное добавление именованной функции и двух разных анонимных функций. Используйте точки останова событий в DevTools, затем удалите только учебные обработчики.

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