Был ли опыт работы с нативным JavaScript и event listeners?
Что проверяют
Понимаете ли вы, как события работают в браузере без фреймворка, или знаете только onClick из React. Спрашивают про опыт, но быстро переходят к механике: фазы события, делегирование, снятие обработчиков. Типичное уточнение: чем event.target отличается от event.currentTarget.
Как отвечать
Начните с примера из своей работы: виджет без фреймворка, обработка скролла, дропдаун с закрытием по клику снаружи. Затем покажите механику:
addEventListener(type, handler, options): вoptionsпередаютсяonce,capture,passive,signal.passive: trueдляtouchstartиwheelобещает браузеру, чтоpreventDefault()не будет, и прокрутка не ждёт обработчика;- фазы: погружение от
windowк цели, цель, всплытие обратно. По умолчанию обработчик срабатывает на всплытии; - делегирование: один обработчик на контейнере вместо сотни на элементах, цель ищется через
event.target.closest('.add-to-cart'). Работает и для элементов, добавленных позже; targetиcurrentTarget: первый это элемент, где возникло событие, второй тот, на котором висит обработчик;stopPropagation()иpreventDefault(): первый останавливает всплытие, второй отменяет действие браузера по умолчанию;- снятие:
removeEventListenerтребует ту же ссылку на функцию и то же значениеcapture. УдобнееAbortController: передалиsignal, вызвалиabort(), и сняты все обработчики разом.
Если вы в основном писали на React, так и скажите, но покажите связь: с React 17 обработчики вешаются на корневой контейнер, по сути это делегирование, а подписки на window в useEffect снимаются в функции очистки.
Где спотыкаются
Читают event.target.dataset у кнопки с иконкой внутри. Клик по иконке даёт target на <svg>, и данных там нет. Нужен currentTarget или closest().
Снимают обработчик, передав в removeEventListener новую анонимную функцию. Ничего не снимается, и в SPA обработчики на window копятся с каждым монтированием.
Делегируют focus и blur, которые не всплывают. Для делегирования есть focusin и focusout либо подписка в фазе погружения.