foundation

Event delegation

Вешайте меньше слушателей: обрабатывайте всплывшие события на стабильных предках и фильтруйте через target или closest.

Делегирование вешает слушатель на устойчивого предка и обрабатывает события от подходящих потомков. Это работает, потому что многие события всплывают. Делегирование снижает churn слушателей в динамических списках, но надёжный код проверяет event.target, использует closest, валидирует вложенность и учитывает события без bubble.

					list.addEventListener('click', (event) => {
  const row = event.target.closest('[data-row]');
  if (!row || !list.contains(row)) return;
  activateRow(row);
});
				

`mouseenter`, `focus` и часть pointer-событий не всплывают — паттерн делегирования другой. `currentTarget` — элемент со слушателем; `target` — источник события.

На интервью: ждите вопросы про большие списки, динамические узлы, target vs currentTarget и особую обработку focus или mouseenter.

Типовые ошибки: слишком высокий предок скрывает владение; без проверки containment срабатывают чужие вложенные виджеты.

Компромисс: удобство против контроля — выбирайте механизм под вашу связность и бюджет производительности.

Чеклист:

  • Стабильный предок с ясным владением.
  • Фильтр через closest и contains.
  • Знайте события без bubble.
  • Не один глобальный обработчик на весь документ.