Общая идея заключается в том, что 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.