哪个更受支持:window.onload还是document.onload?
当前回答
他们什么时候开火?
窗口.卸载
默认情况下,当加载整个页面时,包括其内容(图像、CSS、脚本等),它将被激发。
在某些浏览器中,它现在取代了document.onload的角色,并在DOM就绪时启动。
文档.卸载
当DOM准备就绪时调用,可以在加载图像和其他外部内容之前调用。
他们的支持程度如何?
window.onload似乎是最受支持的。事实上,在某种意义上,一些最现代的浏览器已经用window.onload取代了document.onload。
浏览器支持问题很可能是许多人开始使用jQuery等库来处理文档就绪检查的原因,如下所示:
$(document).ready(function() { /* code here */ });
$(function() { /* code here */ });
为了历史的目的。window.onload与body.nload:
有一段时间,在编写论坛时也提出了类似的问题返回关于window.onload在body.onload上的用法结果似乎是您应该使用window.onload,因为它是很好地将你的结构与动作分开。
其他回答
他们什么时候开火?
窗口.卸载
默认情况下,当加载整个页面时,包括其内容(图像、CSS、脚本等),它将被激发。
在某些浏览器中,它现在取代了document.onload的角色,并在DOM就绪时启动。
文档.卸载
当DOM准备就绪时调用,可以在加载图像和其他外部内容之前调用。
他们的支持程度如何?
window.onload似乎是最受支持的。事实上,在某种意义上,一些最现代的浏览器已经用window.onload取代了document.onload。
浏览器支持问题很可能是许多人开始使用jQuery等库来处理文档就绪检查的原因,如下所示:
$(document).ready(function() { /* code here */ });
$(function() { /* code here */ });
为了历史的目的。window.onload与body.nload:
有一段时间,在编写论坛时也提出了类似的问题返回关于window.onload在body.onload上的用法结果似乎是您应该使用window.onload,因为它是很好地将你的结构与动作分开。
根据解析HTML文档-结束,
浏览器解析HTML源代码并运行延迟脚本。当所有HTML都已解析并运行时,将在文档中发送DOMContentLoaded。事件将弹出窗口。浏览器加载延迟加载事件的资源(如图像)。在窗口处调度加载事件。
因此,执行顺序为
DOMContentLoaded捕获阶段窗口的事件侦听器DOMContentLoaded文档的事件侦听器DOMContentLoaded处于气泡阶段的窗口的事件侦听器加载窗口的事件侦听器(包括onload事件处理程序)
绝不应调用文档中的气泡加载事件侦听器(包括onload事件处理程序)。只能调用捕获加载侦听器,但这是由于子资源(如样式表)的加载,而不是由于文档本身的加载。
window.addEventListener('DOMContentLoaded',函数(){console.log('窗口-DOMContentLoaded-捕获');//第一},true);document.addEventListener('DOMContentLoaded',函数(){console.log('文档-DOMContentLoaded-捕获');//第二},true);document.addEventListener('DOMContentLoaded',函数(){console.log('文档-DOMContentLoaded-气泡');//第二});window.addEventListener('DOMContentLoaded',函数(){console.log('窗口-DOMContentLoaded-气泡');//第三});window.addEventListener('load',函数(){console.log('窗口-加载-捕获');//第四},true);document.addEventListener('load',函数(e){/*筛选出与文档无关的加载事件*/if([style','script'].indexOf(e.target.tagName.toLowerCase())<0)console.log('文档-加载-捕获');//不会发生},true);document.addEventListener('load',function(){console.log('文档-加载-气泡');//不会发生});window.addEventListener('load',函数(){console.log('窗口-加载-气泡');//第四});window.onload=函数(){console.log('窗口-加载');//第四};document.onload=函数(){console.log('文档-加载');//不会发生};
window.onload和onunload是document.body.onload和document.body_onload的快捷方式
所有html标记上的document.onload和onload处理程序似乎是保留的,但从未触发
文档中的“onload”->true
在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&FF的控制台中运行“window.onload.toString()”,你会看到:
“函数onload(event){bodyOnloadHandler()}”
这意味着赋值“window.onload=函数(e)…”被覆盖。
一般的想法是,window.onload在文档的窗口准备好显示时启动,document.onloade在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(可能是大多数当前浏览器)的可见行为。
没有文档。卸载事件。当在<body>中声明时,onload会触发两次,当在<head>中声明(此时事件充当document.onload)时会触发一次。根据计数器的状态进行计数和操作允许模拟两种事件行为。或者在HTML-<head>元素的范围内声明window.onload事件处理程序。
►示例项目:
上面的代码取自这个项目的代码库(index.html和keyboarder.js)。
有关窗口对象的事件处理程序列表,请参阅MDN文档。
推荐文章
- 将.NET DateTime转换为JSON
- SameSite警告Chrome 77
- 在ES6 (ECMAScript 6)中是否有一种不带可变变量的循环x次的机制?
- 克隆对象没有引用javascript
- 验证字符串是否为正整数
- 如何获得一个键/值JavaScript对象的键
- 什么时候JavaScript是同步的?
- 如何在Typescript中解析JSON字符串
- Javascript reduce()在对象
- 在angularJS中& vs @和=的区别是什么
- 错误"Uncaught SyntaxError:意外的标记与JSON.parse"
- JavaScript中的querySelector和querySelectorAll vs getElementsByClassName和getElementById
- 给一个数字加上st, nd, rd和th(序数)后缀
- 如何以编程方式触发引导模式?
- setTimeout带引号和不带括号的区别