哪种支持得到更广泛的支持:window.onload
或document.onload
?
答案 0 :(得分:608)
什么时候开火?
document.onload
他们的支持程度如何?
window.onload似乎是受支持最广泛的。实际上,一些最现代的浏览器在某种意义上用window.onload替换了document.onload。浏览器支持问题很可能是许多人开始使用诸如jQuery之类的库来处理文档准备就绪的原因,如下所示:
$(document).ready(function() { /* code here */ });
$(function() { /* code here */ });
出于历史的目的:
window.onload vs body.onload
作为备注,前一天window.onload
就body.onload
使用{{1}}的问题提出了类似的问题。结果似乎是您应该使用 window.onload ,因为将结构与操作分开是很好的。
答案 1 :(得分:252)
一般的想法是 window.onload触发当文档的窗口准备好演示而 document.onload触发时 DOM树(根据文档中的标记代码构建)已完成。
理想情况下,订阅DOM-tree events,允许通过Javascript进行屏幕操作,导致几乎没有CPU负载。相反, window.onload
可以需要一段时间才能启动,此时尚未请求,解析和加载多个外部资源。
►测试方案:
要观察差异和您的浏览器选择实施上述事件处理程序,只需在文档中插入以下代码 - { {1}} - 标记。
<body>
<强>►Result:强>
以下是Chrome v20(可能是大多数当前浏览器)可观察到的结果行为。
<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>
事件。document.onload
在onload
内声明时触发两次,一次在<body>
内声明(此时事件充当<head>
)。document.onload
元素的范围内声明window.onload
事件处理程序。►示例项目:
上面的代码来自this project's代码库(<head>
和index.html
)。
有关event handlers of the window object的列表,请参阅MDN文档。
答案 2 :(得分:90)
添加事件监听器
<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
window.addEventListener('load', function() {
console.log('All assets are loaded')
})
<小时/>
$(window).on('load', function() {
console.log('All assets are loaded')
})
<小时/> 祝你好运。
答案 3 :(得分:63)
根据Parsing HTML documents - The end,
浏览器解析HTML源并运行延迟脚本。
当所有HTML都已解析并运行时,DOMContentLoaded
将调度document
。该事件会冒泡到window
。
浏览器加载延迟加载事件的资源(如图像)。
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
};
答案 4 :(得分:12)
在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>
您将在Chrome控制台中看到“窗口加载”(首先出现)和“正在加载”。但是,您将在Firefox和IE中看到“body onload”。如果你在IE&amp; amp;的控制台中运行“window.onload.toString()
” FF,你会看到:
“function onload(event){bodyOnloadHandler()}”
表示赋值“window.onload = function(e)...”被覆盖。
答案 5 :(得分:6)
window.onload
和onunload
是document.body.onload
和document.body.onunload
document.onload
和onload
处理程序似乎都被保留但从未被触发
&#39; onload
&#39;在文档中 - &gt;真
答案 6 :(得分:5)
window.onload然而它们通常是同一个东西。类似地,body.onload在IE中成为window.onload。
答案 7 :(得分:1)
Window.onload是标准,但是PS3中的Web浏览器(基于Netfront)不支持窗口对象,因此您无法在那里使用它。
答案 8 :(得分:0)
简而言之
window.onload
是not supported by IE 6-8 document.onload
(永远不会触发事件)
window.onload = () => console.log('window.onload works'); // fired
document.onload = () => console.log('document.onload works'); // not fired