Как распространяются события в DOM
Вопрос
Расскажи, как событие распространяется по DOM и чем отличаются stopPropagation и preventDefault.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Три фазы: погружение, цель, всплытие
Слушатели по умолчанию на всплытии, `capture: true` переносит на погружение
`target` - где возникло, `currentTarget` - где висит обработчик
`stopPropagation` останавливает путь по дереву, но не обработчики того же элемента
`preventDefault` отменяет действие браузера и на распространение не влияет
Не все события всплывают: `focus`, `blur`, `mouseenter`
Что могут спросить следом
- Чем
stopImmediatePropagationотличается отstopPropagation? - Почему злоупотреблять
stopPropagationплохо? - Как поймать
focusна родителе?
Разбор
Событие проходит три фазы. Сначала погружение: браузер идёт от window вниз по предкам к элементу, где оно возникло. Потом фаза цели. Потом всплытие обратно вверх. Обычные слушатели срабатывают на всплытии, а если передать capture: true, то на погружении. В обработчике event.target это исходный элемент, а currentTarget тот, на котором висит слушатель. stopPropagation прерывает путь события по дереву, при этом остальные слушатели того же элемента ещё выполнятся, а stopImmediatePropagation остановит и их. preventDefault совсем про другое: он отменяет действие браузера, например переход по ссылке или отправку формы, а событие при этом продолжает всплывать. Ещё важно, что всплывают не все события: focus, blur, mouseenter не всплывают, для делегирования фокуса есть focusin и focusout. И я стараюсь не злоупотреблять stopPropagation, потому что он ломает логику, которая слушает выше, например закрытие меню по клику снаружи.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Делегирование: плюсы и подводные камни
Следующий вопрос
stopPropagation и соседние обработчики