Answers:
在某些浏览器中,它现在document.onload也可以充当DOM 的角色并在DOM准备就绪时触发。
document.onload
window.onload似乎得到了最广泛的支持。实际上,从某种意义上讲,某些最现代的浏览器已替换document.onload为window.onload。
浏览器支持问题很可能是许多人开始使用jQuery之类的库来处理对文档准备就绪的检查的原因,如下所示:
$(document).ready(function() { /* code here */ });
$(function() { /* code here */ });
为了历史的目的。window.onloadvs body.onload:
不久前在codingforums上也提出了类似的问题,涉及
window.onloadover 的用法body.onload。结果似乎是您应该使用,window.onload因为将您的结构与操作分开是很好的。
window.onload而<body onload="">这是完全不同的(在这种情况下,“从动作中分离结构”更加有意义)。答案不是错误的,而是依据。
document.onloadjQuery等同于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 2017window.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。
因此,执行顺序为
DOMContentLoadedwindow捕获阶段的事件侦听器DOMContentLoaded 的事件监听器 documentDOMContentLoadedwindow泡沫阶段的事件侦听器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