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>