← Назад к вопросам

В чем разница между StopPropagation и StopImmidiatePropagation?

2.0 Middle🔥 172 комментариев
#JavaScript Core#Браузер и сетевые технологии

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между stopPropagation и stopImmediatePropagation

Оба метода используются для управления распространением событий в JavaScript, но они работают по-разному. Разберемся в различиях.

stopPropagation

stopPropagation() предотвращает распространение события вверх по DOM дереву (к родительским элементам). Однако, другие обработчики на том же элементе будут вызваны.

const button = document.querySelector('button');

// Первый обработчик
button.addEventListener('click', (event) => {
  console.log('Обработчик 1');
  event.stopPropagation();
});

// Второй обработчик на ТОМ ЖЕ элементе
button.addEventListener('click', (event) => {
  console.log('Обработчик 2'); // Это БУДЕТ вызвано
});

const parent = document.querySelector('.parent');
parent.addEventListener('click', () => {
  console.log('Родитель'); // Это НЕ будет вызвано
});

// Вывод при клике на button:
// Обработчик 1
// Обработчик 2

Характеристики stopPropagation():

  • Останавливает всплытие события вверх по DOM
  • Не влияет на другие обработчики на том же элементе
  • Другие обработчики выполнятся в том же элементе
  • Используется для предотвращения обработки в родительских элементах

stopImmediatePropagation

stopImmediatePropagation() — более «агрессивный» метод. Он:

  1. Предотвращает распространение вверх (как stopPropagation)
  2. Предотвращает вызов других обработчиков на том же элементе
const button = document.querySelector('button');

// Первый обработчик
button.addEventListener('click', (event) => {
  console.log('Обработчик 1');
  event.stopImmediatePropagation();
});

// Второй обработчик на ТОМ ЖЕ элементе
button.addEventListener('click', (event) => {
  console.log('Обработчик 2'); // Это НЕ будет вызвано
});

const parent = document.querySelector('.parent');
parent.addEventListener('click', () => {
  console.log('Родитель'); // Это НЕ будет вызвано
});

// Вывод при клике на button:
// Обработчик 1

Характеристики stopImmediatePropagation():

  • Останавливает всплытие события вверх по DOM
  • Предотвращает вызов других обработчиков на том же элементе
  • Никакие другие обработчики не выполнятся ни на этом, ни на родительских элементах
  • Останавливает событие полностью

Сравнительная таблица

СвойствоstopPropagationstopImmediatePropagation
Останавливает всплытие вверхДаДа
Останавливает другие обработчики на элементеНетДа
Останавливает обработчики на родителяхДаДа
Влияет на обработчики в capture фазеЧастичноДа

Практический пример с формой

// HTML
/*
<form id="myForm">
  <div class="form-group">
    <button type="submit">Отправить</button>
  </div>
</form>
*/

const form = document.getElementById('myForm');
const button = form.querySelector('button');

// Обработчик на кнопке 1
button.addEventListener('click', (event) => {
  console.log('Проверка валидации');
  event.stopImmediatePropagation();
});

// Обработчик на кнопке 2 - НЕ будет вызван
button.addEventListener('click', (event) => {
  console.log('Отправка аналитики'); // Никогда не выполнится
});

// Обработчик на форме - НЕ будет вызван
form.addEventListener('click', (event) => {
  console.log('Клик по форме'); // Никогда не выполнится
});

// Вывод при клике на кнопку:
// Проверка валидации

Пример со stopPropagation

const form = document.getElementById('myForm');
const button = form.querySelector('button');

// Обработчик на кнопке 1
button.addEventListener('click', (event) => {
  console.log('Проверка валидации');
  event.stopPropagation(); // Используем stopPropagation
});

// Обработчик на кнопке 2 - БУДЕТ вызван
button.addEventListener('click', (event) => {
  console.log('Отправка аналитики'); // Выполнится
});

// Обработчик на форме - НЕ будет вызван
form.addEventListener('click', (event) => {
  console.log('Клик по форме'); // Не выполнится
});

// Вывод при клике на кнопку:
// Проверка валидации
// Отправка аналитики

Event Phases

Важно понимать, что события проходят три фазы:

// Capture phase (спускается вниз)
parent.addEventListener('click', handler, true);

// Target phase (на целевом элементе)
button.addEventListener('click', handler);

// Bubbling phase (поднимается вверх)
parent.addEventListener('click', handler, false);

stopImmediatePropagation() останавливает событие на любой фазе, включая capture.

Когда использовать

Используй stopPropagation() когда:

  • Хочешь предотвратить обработку в родительских элементах
  • Другие обработчики на элементе должны выполниться
  • Нужна более «мягкая» остановка распространения

Используй stopImmediatePropagation() когда:

  • Нужно полностью остановить обработку события
  • Другие обработчики на элементе не должны выполниться
  • Нужна максимальная гарантия изоляции события

Главная разница

stopPropagation — останавливает распространение события вверх по DOM (к родителям), но другие обработчики на том же элементе выполнятся.

stopImmediatePropagation — останавливает всё: другие обработчики на том же элементе не выполнятся, и событие не поднимется к родителям.