我对什么时候触发 window.onload 事件有点困惑。例如:我有一个页面,其中包含大量外部 js 文件,甚至可以按需加载脚本(动态创建标签)。所有这些代码都在页面中(即它不会在点击或 smth 时被触发,它应该在加载时执行)。现在假设我在最后一个按需 javascript 中有 window.onload = somefunction() 。window.onload 是否有可能在所有脚本实际加载之前触发?
window.onload 什么时候触发?
IT技术
javascript
2021-01-20 11:37:00
2个回答
window.onload
(又名body.onload
)在主 HTML、所有 CSS、所有图像和所有其他资源都已加载和呈现后被触发。因此,如果您的图像停顿,则可能需要一些时间。
如果您只需要 HTML (DOM),您可以使用 jQuery $(document).ready()
- 它会在 HTML 被解析但在浏览器完成加载所有外部资源(HTML 中脚本元素之后的图像和样式表)之前触发。
当浏览器解析</script>
每个脚本时,页面中嵌入的脚本就会被执行。因此,要在任何其他脚本之前执行脚本,请<script>
在<head>
.
这意味着您可以window.onload
通过添加<script>
标签作为<body>
.
否。 当所有资源(文档、对象、图像、CSS 等)完成渲染时调用window.onload()。
误读了这个问题。是的,window.onload事件完全有可能在动态附加的脚本完成下载之前触发。使用 DOM ( document.createElement() )添加的脚本异步下载并且不受window.onload()等待所有资源首先完成下载的通常规则的约束。
我为您设置了一个测试套件,http://jsfiddle.net/ywSMW/。此脚本动态地将 jQuery 脚本添加到 DOM 并$
在onload处理程序期间将 的值写入控制台。然后它会在一秒钟后再次写入该值。即使脚本被缓存,第一次写入控制台也会返回undefined,这意味着 onload 甚至在 jQuery 脚本被下载和解析之前就被触发了。
在 IE 和 Chrome 中测试。
回复:评论,如果你想检查onload事件是否已经触发,你可以在onload处理程序中设置一个全局变量的值:
var windowHasLoaded = false;
window.onload = function () {
windowHasLoaded = true;
}
function doSomethingWhenWindowHasLoaded() {
if (!windowHasLoaded) {
// onload event hasn't fired yet, wait 100ms and check again
window.setTimeout(doSomethingWhenWindowHasLoaded, 100);
} else {
// onload event has already fired, so we can continue
}
}
其它你可能感兴趣的问题