Когда событие отправляется элементу, оно спускается по дереву документа в фазе захвата, пока не достигнет цели. Затем , если это пузырьковое событие , оно снова всплывает.
С 2.1 Введение в «События DOM» в стандарте DOM :
Когда событие отправляется объекту, участвующему в дереве (например, элементу), он может достигать прослушивателей событий и у предков этого объекта. Сначала вызываются все прослушиватели событий предка объекта, чья переменная захвата установлена в true, в древовидном порядке. Во-вторых, вызываются собственные слушатели событий И, наконец, и только в том случае, если значение атрибута пузырьков события равно true, прослушиватели событий-предков объекта вызываются снова, но теперь в обратном порядке дерева.
load
не является пузырящимся событием, и - вот важная часть - он не нацелен на document
. Когда вы добавляете прослушиватель захвата, вы действительно получаете load
событий из частей содержимого документа, которые обычно получают событие, таких как сценарии или изображения. На странице, содержащей только сценарий, вы не увидите, что слушатель будет вызван вообще:
<iframe srcdoc="<script>document.addEventListener('load', () => { alert('loaded'); }, true);</script>"></iframe>
И на странице с load
событиями, которые срабатывают после того, как прослушиватель подключен, например, этот фрагмент стека, включающий <style>
s, вы увидите его несколько раз:
let i = 0;
document.addEventListener('load', e => {
console.log(`loaded ${++i}: ${e.target.nodeName}`);
}, true);
Вы, вероятно, намеревались добавить прослушиватель без захвата в window
вместо document
, потому что window
- это то, что получает событие load
, в отличие от document
. (Или вы могли иметь в виду что-то другое. Существует множество способов интерпретировать «загрузку страницы». См. Окно: событие загрузки в MDN для получения подробной информации о том, что означает событие load
для window
, и альтернативные варианты. если это было не то, что вы хотели.)
window.addEventListener("load", function() {
alert("Called on page load");
}, false);