Задать вопрос
johnymkp
@johnymkp

.stopPropagation() на самом деле не останавливает распространение события?

В документации написано, что "The stopPropagation() method of the Event interface prevents further propagation of the current event in the capturing and bubbling phases". Т.е. "... предотвращает дальнейшее распространение текущего события в фазе захвата и всплытия".

Но эксперименты говорят о том, что на самом деле этот метод не останавливает распространение события, а всего лишь указывает браузеру игнорировать дальнейшие обработчики события. Т.е. само событие в любом случае проходит путь от корня до цели и обратно как обычно. Просто если в каком-то обработчике вызвать stopPropagation, то дальнейшие обработчики не будут выполняться.

Например, такой код:
html
<p style="background-color: bisque;">
  <a href="https://microsoft.com" target="_blank">Go to Microsoft</a>
</p>

JS
const p = document.querySelector("p");
const a = document.querySelector("a");

p.addEventListener("click", (event) => {
  // event.stopPropagation();
  console.log("Это click на параграфе при погружении.");
}, true);

a.addEventListener("click", (event) => {
  event.preventDefault();
  console.log("Это click на ссылке при погружении.");
}, true);

Дефолтное поведение при клике на ссылку - перейти на указанный url. Пока stopPropagation в обработчике параграфа закомментирован, клик по ссылке НЕ открывает страницу Microsoft, т.к. дефолтное поведение ссылки остановлено в обработчике на этой ссылке (+мы видим надпись в консоль из обработчика ссылки). Но если раскомментировать stopPropagation, то клик по ссылке ОТКРЫВАЕТ новую страницу (но мы не видим сообщение в консоль из обработчика ссылки). Это говорит о том, что событие click дошло до ссылки и сработало дефолтное поведение для click ссылки. Таким образом, stopPropagation не предотвратило распространение события, а просто вырубило дальнейшие обработчики.

Всё правильно получается? stopPropagation не блокирует распространение события, в определении в документации ошибка?

+Дополнительный вопрос: каким образом дефолтное поведение встраивается в обработку? Просто вызывается как дополнительный метод после срабатывания "нашего" обработчика? А если "нашего" обработчика нет, то дефолт срабатывает вместо него.
  • Вопрос задан
  • 94 просмотра
Подписаться 1 Средний 1 комментарий
Решения вопроса 1
IvanU7n
@IvanU7n
nothing interesting here
Всё правильно получается? stopPropagation не блокирует распространение события, в определении в документации ошибка?

неправильно, JS-события и стандартное поведение браузера связаны между собой опосредовано
если на событии не было вызвано event.preventDefault(), то действие по умолчанию произойдёт независимо от того дошло ли событие до цели или нет
более того есть события, которым чихать на event.preventDefault(), т.к. действие по умолчанию происходит до события (тот же input)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы