哪个更受广泛支持:window.onload
还是 document.onload
?
哪个更受广泛支持:window.onload
还是 document.onload
?
在某些浏览器中,它现在接管了document.onload
的角色,并在DOM准备就绪时触发。
document.onload
window.onload
似乎是最广泛支持的。事实上,一些最现代的浏览器已经在某种程度上用window.onload
替代了document.onload
。
浏览器支持问题很可能是为什么许多人开始使用类似jQuery的库来处理文档准备就绪检查的原因,如下所示:
$(document).ready(function() { /* code here */ });
$(function() { /* code here */ });
为了历史记��而言,window.onload
与body.onload
的区别:
在codingforums上曾经有人问过类似的问题,关于使用
window.onload
还是body.onload
。结果似乎是应该使用window.onload
,因为将结构与行为分离是一个好习惯。
window.onload
和<body onload="">
之间的选择,这完全不同(在这种情况下,“将结构与行为分离”更有意义)。并不是说答案是错的,但它的基础是错误的。 - Valadocument
和window
前缀之间的区别。请检查问题下面第一个评论的链接。 - Rick一般的想法是,当文档的窗口window.onload准备好展示并且文档内的 markup 代码建立起来的DOM tree document.onload完成时会触发。
理想情况下,订阅DOM-tree events可以通过JavaScript进行屏幕外操纵而几乎不产生CPU负载。相反,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>
►结果:
以下是在Chrome v20(以及大多数当前浏览器)中可观察到的行为。
document.onload
事件。<body>
内声明onload
会触发两次,而在<head>
内声明则会被视为document.onload
。<head>
元素内声明window.onload
事件处理程序。►示例项目:
以上代码摘自此项目的代码库(index.html
和keyboarder.js
)。
有关窗口对象的事件处理程序列表,请参阅MDN文档。
添加事件监听器
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", function(event) {
/*
- Code to execute when only the HTML document is loaded.
- This doesn't wait for stylesheets,
images, and subframes to finish loading.
*/
});
</script>
2017年3月更新
window.addEventListener('load', function() {
console.log('All assets are loaded')
})
$(window).on('load', function() {
console.log('All assets are loaded')
})
window.addEventListener('load', function() {...})
。我也已经更新了我的回答。 - Aakash浏览器解析HTML源代码并运行延迟脚本。
当所有HTML已解析并运行时,会在document
上派发DOMContentLoaded
事件。该事件冒泡到window
。
浏览器加载延迟加载的资源(如图像)。
window
上派发load
事件。
window
的DOMContentLoaded
事件侦听器document
的DOMContentLoaded
事件侦听器window
的DOMContentLoaded
事件侦听器window
的load
事件侦听器(包括onload
事件处理程序)一个在document
中的气泡load
事件监听器(包括onload
事件处理程序)不应该被调用。只有捕获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
};
document - load - capture
,这与我在搜索中期望的文档加载未发生的情况相反。奇怪的是,它是不一致的。有时会出现,有时不会,有时会出现两次,但从来没有发生过 document - load - bubble
。我建议不要使用 document load
。 - erroric<style>
和 <script>
元素的加载。我认为 Edge 正确地显示了它们,而 Firefox 和 Chrome 错了。 - OrioluseCapture
选项让我学到了新东西。 - Paul Watson<!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>
在Chrome控制台中,您会看到"窗口已加载"(首先出现)和"body onload"。 但是,在Firefox和IE中,您只会看到"body onload"。如果您在IE和FF的控制台中运行"window.onload.toString()
",您会看到:
"function onload(event) { bodyOnloadHandler() }"
这意味着赋值"window.onload = function(e)..."被覆盖了。
window.onload
和onunload
是document.body.onload
和document.body.onunload
的快捷方式。
document.onload
和所有HTML标签上的onload
处理程序似乎已被保留,但从未触发。
'onload
'在文档中 -> true
window.onload 和 body.onload 在大多数情况下是相同的。但在IE中,body.onload 变成了 window.onload。
Window.onload是标准,但是PS3中的网络浏览器(基于Netfront)不支持window对象,因此您无法在那里使用它。
window
事件:onload
和DOMContentLoaded
。使用示例:window.addEventListener('DOMContentLoaded', callback)
。截至2019年中期,与所有主要浏览器兼容。 - Craig Hickswindow.onload
和document.onload
仍然是不同的!window.onload
似乎发生在之后,并且比document.onload
加载了更多内容!(一些使用window的东西在使用document时无法正常工作!这也适用于document.onreadstatechange 'complete'!) - Andrew