> Как определить элемент, по которому был произведен клик при делегировании событий в JavaScript (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: Exness

Стек: JavaScript

> Пример ответа

Короткий ответ

При делегировании событий элемент, по которому был произведен клик, определяется через свойство event.target. Оно возвращает самый вложенный элемент, на котором произошло событие. Для проверки, является ли целевой элемент нужным, используется метод closest(selector), который проверяет сам элемент и его предков до контейнера-делегата.

Подробное объяснение

Делегирование событий основано на всплытии (bubbling) - событие от целевого элемента поднимается вверх по DOM-дереву. В обработчике, повешенном на родительский контейнер, event.target указывает на исходный элемент клика, а не на контейнер, где висит обработчик. Это ключевое отличие от event.currentTarget, который всегда ссылается на элемент с обработчиком.

Для точного определения нужного элемента используется closest(selector) - он ищет ближайшего предка (включая сам элемент), соответствующего CSS-селектору. Это удобно, когда нужно отловить клик по элементу с определенным классом, но пользователь может кликнуть по вложенному дочернему элементу (например, по иконке внутри кнопки). closest гарантирует, что мы найдем родительский элемент с нужным селектором, даже если клик был по его потомку.

Также можно использовать matches(selector) для проверки только самого event.target, но это менее надежно при вложенной структуре. closest предпочтительнее, так как покрывает случаи с глубокой вложенностью.

На практике

В реальных проектах делегирование применяется для:

  • Динамически добавляемых элементов (списки, таблицы, меню)
  • Оптимизации производительности при большом количестве однотипных элементов
  • Упрощения кода при работе с вложенными структурами (например, дерево комментариев)

Типичный сценарий: есть список задач, каждая содержит чекбокс, текст, кнопку удаления. Обработчик вешается на контейнер <ul>, а внутри через closest определяется, по какому именно элементу кликнули - по чекбоксу, тексту или кнопке.

Пример кода

JAVASCRIPT
// Контейнер для делегирования
const list = document.querySelector('.task-list');
list.addEventListener('click', (event) => {
// Находим ближайший элемент с классом .task-item
const taskItem = event.target.closest('.task-item');
if (!taskItem) return; // Клик вне элемента задачи
// Определяем, по какому дочернему элементу кликнули
if (event.target.closest('.delete-btn')) {
// Удаление задачи
taskItem.remove();
} else if (event.target.closest('.checkbox')) {
// Переключение статуса
taskItem.classList.toggle('completed');
} else {
// Редактирование текста
console.log('Клик по тексту задачи');
}
});

Как отвечать на собеседовании

Начни с event.target как базового механизма, затем объясни разницу с event.currentTarget. Покажи понимание всплытия событий и почему closest предпочтительнее matches. Приведи пример с динамическими элементами - это покажет, что ты понимаешь практическую пользу делегирования. Упомяни, что closest возвращает null, если элемент не найден, поэтому нужна проверка. Избегай излишних деталей про фазы события (capture/bubble), если не спросят прямо.

Что проверяет интервьюер

  • Понимание event propagation (всплытие, целевая фаза)
  • Умение различать target и currentTarget
  • Знание методов closest и matches для навигации по DOM
  • Практический опыт с делегированием в динамических интерфейсах
  • Осознание trade-off: делегирование vs прямые обработчики

Типичные ошибки

  • Использование event.target без проверки на closest, что ломается при клике по вложенным элементам
  • Путаница между target и currentTarget - кандидат думает, что target всегда элемент с обработчиком
  • Забывают проверять null от closest, что приводит к ошибкам при клике вне целевых элементов
  • Пытаются использовать matches для глубокой вложенности вместо closest
  • Не учитывают, что делегирование не работает для событий, которые не всплывают (например, focus, blur)

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью