JavaScript 📜
December 27, 2024
В чём разница между event.preventDefault() и event.stopPropagation()?
У всех событий в Javascript есть 3 фазы: погружение, таргет и всплытие:
- Capturing (погружение): событие идёт сверху вниз по дереву элементов (от родителя к дочерним элементам).
- Target (цель): событие достигает элемента, на котором непосредственно повесили обработчик (или того элемента, который является «целью» события).
- Bubbling (всплытие): затем событие идёт снизу вверх (от дочернего элемента к родительским).
По умолчанию большинство событий обрабатываются на фазе всплытия (bubbling). Но при желании можно «перехватывать» их и на фазе погружения (capture), если установить соответствующий флаг при добавлении обработчика:
event.preventDefault()— блокирует стандартное действие элемента (например, переход по ссылке, отправку формы, контекстное меню). При этом событие продолжит распространяться дальше (погружение или всплытие не останавливаются).event.stopPropagation()— прерывает дальнейшее всплытие (или погружение) события. Оно не влияет на стандартное действие элемента, а именно останавливает передачу события на вышестоящие (родительские) элементы DOM.
Чтобы лучше понять, разберем такой пример:
<html>
<head></head>
<body>
<div id="parent" style="border: 1px solid red; padding: 20px">
Parent
<a id="child" href="#" style="display: block; margin-top: 10px">
Child (ссылка)
</a>
</div>
<script>
document.getElementById('parent')
.addEventListener('click',
(event) => {
console.log('Клик на PARENT');
});
document.getElementById('child')
.addEventListener('click', (event) => {
event.preventDefault(); // отменит переход по ссылке
event.stopPropagation(); // отменит событие parent, но оставит click
console.log('Клик на CHILD')});
</script>
</body>
</html>