Різниця між подіями DOMContentLoaded та завантаженням


Відповіді:


191

Від центру розробників Mozilla :

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


27
Fyi, той самий MDN-посилання [зараз] також говорить: "Примітка: Stylesheet завантажує виконання сценарію блоку, тому якщо у вас є <script> після <link rel =" stylesheet "...>, сторінка не завершить розбір - і DOMContentLoaded не запускатиметься, доки не завантажується таблиця стилів. "
Нік

10
@Nick Ця сторінка дає причину. html5rocks.com/en/tutorials/internals/howbrowserswork Я б рекомендував переглянути відео на сторінці.
abhisekp

1
@abhisekp приємний підручник, хоча це відео посилання тепер застаріло
супі

Таким чином дерево візуалізації будується після запуску DOMContentLoaded. Але DOMContentLoaded не чекає зображень / суб-ресурси / підрамники для завершення завантаження в відповідно до developer.mozilla.org/en-US/docs/Web/API/Window / ... . Чи знаєте ви, чи називають ці зображення / підрамники / підресурси деревом візуалізації після його побудови, або вони вже викликали дерево DOM, поки дерево візуалізації ще будувалося? Іншими словами, чи запускає дерево візуалізації купу зв'язків для завантаження цих зображень / підкадрів / підресурсів або їх завантаження вже здійснювалося раніше?
weefwefwqg3

83

DOMContentLoadedПодія буде спрацьовувати , як тільки ієрархія DOM була повністю побудована, то loadподія буде робити це , коли все зображення і підкадрів закінчили навантаження.

DOMContentLoadedпрацюватиме на більшості сучасних браузерів, але не на IE, включаючи IE9 і вище. Існують деякі шляхи вирішення цієї події на старих версіях IE, як, наприклад, у бібліотеці jQuery, вони прикріплюють конкретну onreadystatechange подію IE .


7
На яку подію ви звертаєтесь, говорячи "Ця подія"?
Том Хаббард

2
"Ця подія" = DOMContentLoaded. Це не працює в IE8. Якщо вам потрібно його підтримати, скористайтеся методом вирішення, на який посилається CMS
Jan Derk

53

Переконайтесь самі в різниці:

DEMO

Від Microsoft IE

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

Від мережі розробників Mozilla

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


Чи DOMContentLoadedгарантує, що всі сценарії (включаючи відкладати / асинхронізувати) завантажені? Тут нічого не сказано про сценарії: developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
Сергій

@Sergey Nope. Ресурси async - тобто <скрипт async src = app.js /> - завантажуються незалежно від решти сторінки, отже DOMContentLoaded може запускатися до отримання ресурсу з сервера
Мехрад Садег

1
@MehradSadegh Я думаю, ви помиляєтесь! З документації на MDN : Сценарії з атрибутом відстрочки запобігають запуску події 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 () {...}), запуститься, коли буде готова вся сторінка (зображення чи рамки), а не лише DOM.

Дивіться: http://learn.jquery.com/using-jquery-core/document-ready/


1
Питання не в jQuery.
користувач34660

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.