Возможно ли, что когда мы добавим обработчик событий для DOM Ready, будет слишком поздно? - PullRequest
0 голосов
/ 17 января 2020

Теоретически, не правда, что наш код может добавить прослушиватель событий для DOM Ready, но когда мы добавляем его, уже слишком поздно?

Например, если мы ссылаемся на .js файл в конце <body> ... </body>, и время загрузки этого .js файла составляет 2 или 3 секунды спустя, и DOM уже давно готов, событие уже запущено, и все слушатели уведомлены, и теперь JS код

window.addEventListener('DOMContentLoaded', (event) => {
    console.log('DOM Ready event fired');
});

и действительно ли сейчас слишком поздно, и обработчик никогда не будет вызван? На практике этого не происходит и не должно происходить, потому что тогда будет странное поведение. Так как это обрабатывается? Обозначает ли браузер «задним числом» уведомления слушателей (даже если слушатель был добавлен слишком поздно, браузер уведомит об этом?).

Сказав это, «браузер уведомит слушателя, даже если он был добавлен слишком поздно». неверно, если мы зарегистрируем прослушиватель готовности DOM внутри обработчика готовности DOM:

window.addEventListener('DOMContentLoaded', (event) => {
  console.log('DOMContentLoaded event fired 01');
  window.addEventListener('DOMContentLoaded', (event) => {
    console.log('DOM Ready event fired 02');
  });
});

Другой способ - это когда мы загружаем страницу, а затем в консоли отладки набираем

window.addEventListener('DOMContentLoaded', (event) => {
    console.log('DOM Ready event fired');
});

Это даже правда, что если мы пропустили текущий цикл событий, тогда он не будет вызван:

setTimeout(function() {
  window.addEventListener('DOMContentLoaded', (event) => {
    console.log('DOM Ready event fired');
  });
}, 0);

Так в чем же заключается правило, если слушатель добавляется слишком поздно?

1 Ответ

1 голос
/ 17 января 2020

Нет, это не проблема.

Событие DOMReady не запускается, пока не загружены все HTML, что включает в себя загрузку всех сценариев. Исключение составляют скрипты с атрибутом async; они загружаются в фоновом режиме, и DOMReady не ждет их. Скрипты с атрибутом defer также загружаются в фоновом режиме, но браузер ожидает их загрузки перед отправкой события DOMReady.

И если вы используете jQuery, вы можете использует свою функцию .ready() даже после загрузки DOM. Если вы вызываете $(document).ready() позже, он просто вызывает функцию немедленно, а не добавляет прослушиватель событий.

См. Сценарии: asyn c, отложить для объяснения синхронного и асинхронного. загрузка скриптов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...