В документации написано, что "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>
JSconst 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 не блокирует распространение события, в определении в документации ошибка?
+Дополнительный вопрос: каким образом дефолтное поведение встраивается в обработку? Просто вызывается как дополнительный метод после срабатывания "нашего" обработчика? А если "нашего" обработчика нет, то дефолт срабатывает вместо него.