Answers:
在某些浏览器中,它现在document.onload
也可以充当DOM 的角色并在DOM准备就绪时触发。
document.onload
window.onload
似乎得到了最广泛的支持。实际上,从某种意义上讲,某些最现代的浏览器已替换document.onload
为window.onload
。
浏览器支持问题很可能是许多人开始使用jQuery之类的库来处理对文档准备就绪的检查的原因,如下所示:
$(document).ready(function() { /* code here */ });
$(function() { /* code here */ });
为了历史的目的。window.onload
vs body.onload
:
不久前在codingforums上也提出了类似的问题,涉及
window.onload
over 的用法body.onload
。结果似乎是您应该使用,window.onload
因为将您的结构与操作分开是很好的。
window.onload
而<body onload="">
这是完全不同的(在这种情况下,“从动作中分离结构”更加有意义)。答案不是错误的,而是依据。
document.onload
jQuery等同于JS document.ready
?
总的想法是,在window.onload火灾时文档的窗口准备演示和document.onload火灾的时候DOM树(文档内的标记代码生成)的完成。
理想情况下,订阅DOM树事件,可以通过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
事件。onload
在中声明时触发两次,在中声明时触发<body>
一次<head>
(事件在此充当document.onload
)。window.onload
,在HTML- <head>
元素的范围内声明事件处理程序。►示例项目:
上面的代码摘自该项目的代码库(index.html
和keyboarder.js
)。
添加事件监听器
<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')
})
window.addEventListener('load', function() {...})
。我也更新了答案。
根据解析HTML文档-最后,
浏览器解析HTML源并运行延迟的脚本。
在所有HTML都已解析并运行DOMContentLoaded
后,document
在调度A。事件冒泡到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
};
document - load - capture
并确实发生了这,这与我在搜索中期望的为什么文档加载没有发生的原因背道而驰。奇怪的是,这是不一致的。有时它出现,有时它没有出现,有时它出现两次-但从未document - load - bubble
发生。我建议不要使用document load
。
load
事件是在外部资源上调度的。该事件不会冒泡,因此通常不会在文档上检测到它,但是应该在捕获阶段。这些条目引用<style>
和<script>
元素的负载。我认为Edge是展示它们的正确方法,而Firefox和Chrome是错误的。
useCapture
选项教会了我一些新知识。
在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”。如果您运行“window.onload.toString()
在IE&FF的控制台中 ”,则会看到:
“函数onload(event){bodyOnloadHandler()}”
这意味着赋值“ window.onload = function(e)...”被覆盖。
window
事件:onload
和DOMContentLoaded
。用法示例:,window.addEventListener('DOMContentLoaded', callback)
。截至2019年中,与所有主流浏览器兼容。----- developer.mozilla.org/en-US/docs/Web/API/Window/... ------ developer.mozilla.org/en-US/docs/Web/API/Window/load_event