Window.onload vs document.onload
Что более широко поддерживается: window.onload
или document.onload
?
Ответы
Ответ 1
Когда они стреляют?
window.onload
- По умолчанию она запускается при загрузке всей страницы, включая ее содержимое (изображения, CSS, скрипты и т.д.).
В некоторых браузерах он теперь берет на себя роль document.onload
и срабатывает, когда DOM также готов.
document.onload
- Он вызывается, когда DOM готов, что может быть до изображений и другого внешнего содержимого.
Насколько хорошо они поддерживаются?
window.onload
представляется наиболее широко поддерживаемым. Фактически, некоторые из самых современных браузеров в некотором смысле заменили document.onload
на window.onload
.
Проблемы с поддержкой браузера, скорее всего, являются причиной того, что многие люди начинают использовать библиотеки, такие как jQuery, для обработки проверки готовности документа, например:
$(document).ready(function() { /* code here */ });
$(function() { /* code here */ });
Для истории. window.onload
против body.onload
:
Подобный вопрос задавался на codingforums некоторое время назад, относительно использования window.onload
над body.onload
. В результате, кажется, вы должны использовать window.onload
, потому что это хорошо, чтобы отделить вашу структуру от действия.
Ответ 2
Общая идея заключается в том, что window.onload срабатывает, когда окно документа готово к презентации и document.onload запускает, когда Дерево DOM (построено из кода разметки внутри документа) завершено.
В идеале, подписываясь на события DOM-дерева, позволяет выполнять скрытые манипуляции с помощью Javascript, неся практически без загрузки процессора, Напротив, window.onload
может потратить время на, когда несколько внешних ресурсов еще не запрошены, проанализированы и загружены.
►Тест сценария:
Чтобы заметить разницу и , как ваш браузер по выбору реализует вышеупомянутые обработчики событий , просто вставьте следующий код в свой документ - <body>
- тег.
<script language="javascript">
window.tdiff = []; fred = function(a,b){return a-b;};
window.document.onload = function(e){
console.log("document.onload", e, Date.now() ,window.tdiff,
(window.tdiff[0] = Date.now()) && window.tdiff.reduce(fred) );
}
window.onload = function(e){
console.log("window.onload", e, Date.now() ,window.tdiff,
(window.tdiff[1] = Date.now()) && window.tdiff.reduce(fred) );
}
</script>
►Result:
Вот результат, наблюдаемый для Chrome v20 (и, вероятно, большинства современных браузеров).
- Нет
document.onload
.
-
onload
срабатывает дважды, когда объявляется внутри <body>
, один раз, когда объявляется внутри <head>
(где событие затем действует как document.onload
).
- подсчет и действие, зависящие от состояния счетчика, позволяют эмулировать поведение обоих событий.
- В качестве альтернативы объявить обработчик события
window.onload
в пределах элемента HTML- <head>
.
►Пример проекта:
Вышеприведенный код взят из кода этого проекта (index.html
и keyboarder.js
).
Для списка обработчиков событий объекта окна, обратитесь к документации MDN.
Ответ 3
Добавить прослушиватель событий
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", function(event) {
// - Code to execute when all DOM content is loaded.
// - including fonts, images, etc.
});
</script>
Update March 2017
1 Ванильный JavaScript
window.addEventListener('load', function() {
console.log('All assets are loaded')
})
2 jQuery
$(window).on('load', function() {
console.log('All assets are loaded')
})
Удачи.
Ответ 4
Согласно Разбор HTML-документов - конец,
-
Браузер анализирует источник HTML и запускает отложенные сценарии.
-
A DOMContentLoaded
отправляется в document
, когда весь HTML был проанализирован и запущен. Событие пузырится на window
.
-
Браузер загружает ресурсы (например, изображения), которые задерживают событие загрузки.
-
Событие A load
отправляется на window
.
Следовательно, порядок выполнения будет
-
DOMContentLoaded
прослушиватели событий window
в фазе захвата
-
DOMContentLoaded
прослушиватели событий document
-
DOMContentLoaded
прослушиватели событий window
в фазе пузырьков
-
load
прослушиватели событий (включая обработчик событий onload
) window
Вызов вызывающего события пузырька load
(включая обработчик события onload
) в document
никогда не должен вызываться. Можно вызвать только захват load
, но из-за нагрузки под-ресурс, такой как таблица стилей, не из-за загрузки самого документа.
window.addEventListener('DOMContentLoaded', function() {
console.log('window - DOMContentLoaded - capture'); // 1st
}, true);
document.addEventListener('DOMContentLoaded', function() {
console.log('document - DOMContentLoaded - capture'); // 2nd
}, true);
document.addEventListener('DOMContentLoaded', function() {
console.log('document - DOMContentLoaded - bubble'); // 2nd
});
window.addEventListener('DOMContentLoaded', function() {
console.log('window - DOMContentLoaded - bubble'); // 3rd
});
window.addEventListener('load', function() {
console.log('window - load - capture'); // 4th
}, true);
document.addEventListener('load', function(e) {
/* Filter out load events not related to the document */
if(['style','script'].indexOf(e.target.tagName.toLowerCase()) < 0)
console.log('document - load - capture'); // DOES NOT HAPPEN
}, true);
document.addEventListener('load', function() {
console.log('document - load - bubble'); // DOES NOT HAPPEN
});
window.addEventListener('load', function() {
console.log('window - load - bubble'); // 4th
});
window.onload = function() {
console.log('window - onload'); // 4th
};
document.onload = function() {
console.log('document - onload'); // DOES NOT HAPPEN
};
Ответ 5
В Chrome window.onload отличается от <body onload="">
, тогда как они одинаковы как в Firefox (версия 35.0), так и в IE (версия 11).
Вы можете изучить это следующим фрагментом:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!--import css here-->
<!--import js scripts here-->
<script language="javascript">
function bodyOnloadHandler() {
console.log("body onload");
}
window.onload = function(e) {
console.log("window loaded");
};
</script>
</head>
<body onload="bodyOnloadHandler()">
Page contents go here.
</body>
</html>
И вы увидите как "окно загружено" (что в первую очередь), так и "bodyload" в консоли Chrome. Тем не менее, вы увидите только "bodyload" в Firefox и IE. Если вы запускаете "window.onload.toString()
" в консолях IE и FF, вы увидите:
"onload (event) {bodyOnloadHandler()}"
что означает, что присваивание "window.onload = function (e)..." перезаписано.
Ответ 6
window.onload
и onunload
являются ярлыками для document.body.onload
и document.body.onunload
document.onload
и onload
обработчик по всему тегу html, похоже, зарезервирован, но никогда не запускается
'onload
' в документе → true
Ответ 7
window.onload однако они часто одно и то же. Аналогично body.onload становится window.onload в IE.
Ответ 8
Window.onload является стандартным, однако - веб-браузер в PS3 (на основе Netfront) не поддерживает объект окна, поэтому вы не можете его там использовать.
Ответ 9
Вы также можете проверить jQuery, который предоставляет надежную проверенную модель событий в кросс-браузере.