Разница между DOMContentLoaded и событиями загрузки


Ответы:


191

Из Центра разработчиков Mozilla :

Событие DOMContentLoaded наступает, когда документ полностью загружен и проанализирован, не дожидаясь окончания загрузки таблиц стилей, изображений и подкадров (событие загрузки может использоваться для обнаружения полностью загруженной страницы).


27
Кстати, та же ссылка MDN [сейчас] также говорит: «Примечание. Таблица стилей загружает выполнение скрипта блока, поэтому если у вас есть <script> после <link rel =" stylesheet "...>, страница не будет завершена синтаксический анализ - и DOMContentLoaded не будет запускаться - пока не будет загружена таблица стилей. "
Ник

10
@ Ник Эта страница дает причину. html5rocks.com/en/tutorials/internals/howbrowserswork Я бы порекомендовал посмотреть видео на странице.
abhisekp

1
@abhisekp хороший учебник, хотя ссылка на видео сейчас устарела
supi

Таким образом, дерево рендеринга создается после запуска DOMContentLoaded. Но DOMContentLoaded не ожидает завершения загрузки изображений / подресурсов / подкадров в соответствии с developer.mozilla.org/en-US/docs/Web/API/Window/… . Знаете ли вы, если эти изображения / подкадры / субресурсы вызываются деревом рендеринга после того, как оно было построено, или они уже были вызваны деревом DOM, когда дерево рендеринга все еще строилось? Другими словами, запускает ли дерево рендеринга группу соединений для загрузки этих изображений / подкадров / подресурсов или их загрузка уже осуществлялась раньше?
weefwefwqg3

83

DOMContentLoadedСобытие будет срабатывать , как только иерархия DOM была полностью построена, то loadсобытие будет делать это , когда все изображения и подкадры закончили погрузку.

DOMContentLoadedбудет работать в большинстве современных браузеров, но не в IE, включая IE9 и выше. Есть некоторые обходные пути для имитации этого события в более старых версиях IE, например, используемые в библиотеке jQuery, они прикрепляют специфичное для IE onreadystatechange событие.


7
На какое событие вы ссылаетесь, когда говорите «Это событие»?
Том Хаббард,

2
«Это событие» = DOMContentLoaded. Это не работает в IE8. Если вам нужно его поддержать, используйте обходной путь, на который ссылается CMS
Jan Derk

53

Смотри разницу сам:

DEMO

От Microsoft IE

Событие DOMContentLoaded наступает, когда анализ текущей страницы завершен; событие загрузки срабатывает после завершения загрузки всех файлов со всех ресурсов, включая рекламу и изображения. DOMContentLoaded - отличное событие для подключения функциональности пользовательского интерфейса к сложным веб-страницам.

Из Сети разработчиков Mozilla

Событие DOMContentLoaded наступает, когда документ полностью загружен и проанализирован, не дожидаясь окончания загрузки таблиц стилей, изображений и подкадров (событие загрузки может использоваться для обнаружения полностью загруженной страницы).


DOMContentLoadedГарантирует ли, что все скрипты (включая defer / async) были загружены? Здесь ничего не сказано о скриптах: developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
Сергей

@ Сергей Нет. асинхронные ресурсы - т.е. <script async src = app.js /> - загружаются независимо от остальной части страницы, поэтому DOMContentLoaded может сработать до того, как ресурс будет извлечен с сервера
Мехрад Садег

1
@MehradSadegh Я думаю, что вы не правы! Из документации MDN : сценарии с атрибутом defer будут предотвращать запуск события DOMContentLoaded до тех пор, пока сценарий не загрузится и не завершит оценку. Вы можете взглянуть на этот SO вопрос, который подтверждает это: stackoverflow.com/questions/42950574/…
radzak

1
@Jatimir Я думаю, что атрибуты defer и async имеют разное поведение.
Мехрад Садег

1
@Jatimir Рад, что вы опубликовали в любом случае, потому что ваш вклад был именно то, что я искал! Спасибо!
Роберт Уайлдлинг

29

DOMContentLoaded==window.onDomReady()

Load==window.onLoad()

Страницу нельзя безопасно обрабатывать, пока документ не «готов». JQuery обнаруживает это состояние готовности для вас. Код, включенный в $ (document) .ready (), будет выполняться только после того, как страница объектной модели документа (DOM) будет готова для выполнения кода JavaScript. Код, включенный в $ (window) .load (function () {...}), будет запущен, когда будет готова вся страница (изображения или iframes), а не только DOM.

Смотрите: http://learn.jquery.com/using-jquery-core/document-ready/


1
Вопрос не в jQuery.
user34660

4
@ user34660 Не так, но полезно понять.
Андерсон

16
  • domContentLoaded : отмечает точку, когда DOM готов, и нет таблиц стилей, которые блокируют выполнение JavaScript - это означает, что теперь мы можем (потенциально) построить дерево рендеринга. Многие JavaScript-фреймворки ждут этого события, прежде чем начнут выполнять свою собственную логику. По этой причине браузер фиксирует временные метки EventStart и EventEnd, чтобы позволить нам отслеживать, сколько времени заняло это выполнение.

  • loadEvent : на последнем этапе загрузки каждой страницы браузер запускает событие «onload», которое может вызвать дополнительную логику приложения.

источник


Если у меня есть какие-либо теги сценариев с URL для JS, они будут загружаться до domContentLoaded или после?
Паван

0

Вот код, который работает для нас. Мы обнаружили, что MSIE ударил и пропустил DomContentLoaded, кажется, что есть некоторая задержка, когда никакие дополнительные ресурсы не кэшируются (до 300 мс, основываясь на нашем журнале консоли), и он срабатывает слишком быстро, когда они кэшируются. Таким образом, мы прибегли к отступлению для MISE. Вы также хотите активировать doStuff()функцию независимо от того, DomContentLoadedзапускается ли она до или после ваших внешних файлов JS.

// detect MSIE 9,10,11, but not Edge
ua=navigator.userAgent.toLowerCase();isIE=/msie/.test(ua);

function doStuff(){
    //
}
if(isIE){
    // play it safe, very few users, exec ur JS when all resources are loaded
    window.onload=function(){doStuff();}
} else {
    // add event listener to trigger your function when DOMContentLoaded
    if(document.readyState==='loading'){
        document.addEventListener('DOMContentLoaded',doStuff);
    } else {
        // DOMContentLoaded already loaded, so better trigger your function
        doStuff();
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.