DOMContentLoaded
和load
事件有什么区别?
DOMContentLoaded
和load
事件有什么区别?
DOMContentLoaded事件在文档已经完全加载和解析之后被触发,不用等待样式表、图像和子框架完成加载(可以使用load事件检测完全加载的页面)。
DOMContentLoaded
事件将在DOM层次结构完全构建后立即触发,load
事件将在所有图像和子框架加载完成时执行。
DOMContentLoaded
适用于大多数现代浏览器,但不包括IE,包括IE9及以上版本。有一些解决方法可以在旧版本的IE上模拟此事件,例如使用jQuery库上使用的IE特定的onreadystatechange
事件。
自行体验差异:
来自 Microsoft IE
当当前页面解析完成时,DOMContentLoaded事件会触发;而所有文件都从所有资源中(包括广告和图片)加载完毕后,load事件才会触发。DOMContentLoaded是一个很好的事件,可用于将UI功能与复杂的网页连接起来。
当文档完全加载并解析完成时,DOMContentLoaded事件会被触发,无需等待样式表、图像和子框架完成加载(可以使用load事件检测完全加载的页面)。
DOMContentLoaded
保证所有脚本(包括 defer/async)都已加载完毕吗?这里并没有提到脚本:developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded - Sergdefer
。我的错 :) - radzakDOMContentLoaded
等同于 window.onDomReady()
Load
等同于 window.onLoad()
在文档“准备就绪”之前,页面不能安全地进行操作。jQuery为您检测到了这种就绪状态。
$(document).ready()
中的代码将只在页面文档对象模型(DOM)准备好执行JavaScript代码时运行一次。$(window).load(function() { ... })
中的代码将在整个页面(包括图像或iframe),而不仅仅是 DOM 准备就绪时运行一次。
window.onDomReady()
这样的东西。 - T SDOMContentLoaded
事件,当DOM、CSSOM和所有其他资源加载完成时,将触发load
事件。如果没有JavaScript,那么您的网页加载顺序可能如下所示:
或者用检查窗口的话来说,DOMContentLoaded
事件将比load
事件提前很多(蓝线表示DOMContentLoaded
,红线表示load
事件):
然而,如果您使用的是JavaScript(不是async或defer),则DOM创建将等待JS加载。由于JS还修改CSS,因此JS将等待CSSOM加载。DOMContentLoaded
事件的创建实际上也必须等待样式表加载完成。DOMContentLoaded
和load
的主要区别在于,仅涉及图像的加载时间,在此情况下,图像可以与样式表和JS并行下载。
请注意,如果您在JS中使用async或defer,则不会发生这种情况:
domContentLoaded:标志着DOM已准备就绪,没有阻塞JavaScript执行的样式表 - 这意味着我们现在可以(可能)构建渲染树。许多JavaScript框架在开始执行其自身逻辑之前等待此事件。因此,浏览器捕获EventStart和EventEnd时间戳,以便我们跟踪此执行所花费的时间。
loadEvent:在每个页面加载的最后一步骤中,浏览器会触发“onload”事件,该事件可以触发其他应用程序逻辑。
// detect MSIE 9,10,11, but not Edge
ua=navigator.userAgent.toLowerCase();isIE=/msie/.test(ua);
function doStuff(){
//
}
if(isIE){
// play it safe, very few users, exec ur JS when all resources are loaded
window.onload=function(){doStuff();}
} else {
// add event listener to trigger your function when DOMContentLoaded
if(document.readyState==='loading'){
document.addEventListener('DOMContentLoaded',doStuff);
} else {
// DOMContentLoaded already loaded, so better trigger your function
doStuff();
}
}
在Chrome 80+的高版本中,拥有最多批准者的答案是错误的。
1、DOMContentLoaded事件直到CSS和JavaScript被执行并且DOM被解析(文档已加载)才会触发。
2、window.onload事件直到所有网络资源(如CSS和JavaScript)都被加载并且DOM被解析(文档已加载)才会触发。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>DOMContentLoaded , load</title>
<link href="http://localhost/public/css?sleep=5000" rel="stylesheet">
<!-- 5000 milliseconds after the URL request the server begins to respond -->
</head>
<body>
<img src="http://localhost/public/img?sleep=8000">
<!-- 8000 milliseconds after the URL request the server starts responding to the resource -->
<script>
document.addEventListener('DOMContentLoaded', () => {
console.log('DOMContentLoaded OKOK')
})
window.addEventListener('load', () => {
console.log('window load OK')
})
</script>
<script src="http://localhost/public/js?sleep=2000"></script>
<!-- 2000 milliseconds after the URL request the server begins to respond -->
</body>
</html>
console.log('domContentLoaded OKOK'
8秒时开始运行console.log('Window Load OK'
。