window.onload 什么时候触发?

IT技术 javascript
2021-01-20 11:37:00

我对什么时候触发 window.onload 事件有点困惑。例如:我有一个页面,其中包含大量外部 js 文件,甚至可以按需加载脚本(动态创建标签)。所有这些代码都在页面中(即它不会在点击或 smth 时被触发,它应该在加载时执行)。现在假设我在最后一个按需 javascript 中有 window.onload = somefunction() 。window.onload 是否有可能在所有脚本实际加载之前触发?

2个回答

window.onload(又名body.onload)在主 HTML、所有 CSS、所有图像和所有其他资源都已加载和呈现后被触发。因此,如果您的图像停顿,则可能需要一些时间。

如果您只需要 HTML (DOM),您可以使用 jQuery $(document).ready()- 它会在 HTML 被解析但在浏览器完成加载所有外部资源(HTML 中脚本元素之后的图像和样式表)之前触发

当浏览器解析</script>每个脚本时,页面中嵌入的脚本就会被执行因此,要在任何其他脚本之前执行脚本,请<script><head>.

这意味着您可以window.onload通过添加<script>标签作为<body>.

呃,DOMContentLoaded,而不是DOMReady :)
2021-03-21 11:37:00
虽然脚本是一个阻塞调用,但它真的像那样基本,我认为 onload 一直等到所有引用的资源也下载完毕。因此,如果您引用了 Web 趋势或 HBX 使用的跟踪图像需要一段时间来处理或只是加载缓慢的资源(大图像?),则 onload 事件将不会触发,直到 HTML 已被解析且资源已被解析称为下载。
2021-03-26 11:37:00
好吧,window.onload 和 jquery 的 $(document.ready()) 与这里所暗示的响应不同......当所有加载(图像和 DOM)时触发,后者在 DOM 准备好时触发
2021-03-29 11:37:00
body.onloadwindow.onload是相同的 - body.onload是作为一种使用onload属性直接通过 HTML元素设置window.onload处理程序的方式提供的在下载并渲染所有图像之前,onload不会触发。相当肯定,这适用于CSS的图像了。<BODY>
2021-03-31 11:37:00
@保罗是对的。 window.onload不会在浏览器解析</html>时触发,它会在所有图像、对象和其他资源都已下载和呈现时触发。您将它与变异事件DOMReady混淆,后者在文档被解析时触发。此外,动态添加的脚本元素会异步下载,因此它们不受此规则的约束。
2021-04-11 11:37:00

否。 当所有资源(文档、对象、图像、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
    }        
}        
@Marius S:是的,您可以检查document.readyState属性。解析文档时,它的值为"loaded"onload触发后,它的值为"complete"
2021-03-29 11:37:00
@Marius:w3c 不维护浏览器兼容性参考。您可能会将 w3c 与 W3Schools 混淆。Firefox确实支持它,但仅在 3.6 及更高版本支持。最简单的解决方案是创建一个全局变量,例如var loaded;,然后在onload事件处理程序中,将该变量设置为true当 onload 事件已经触发时,从代码中的任何其他地方访问该变量将产生true
2021-03-30 11:37:00
@Marius:你说的是哪些浏览器?IE、Firefox、Chrome、Safari 和 Opera 支持document.readyState
2021-04-03 11:37:00
如果窗口已经加载,有什么办法可以在脚本中测试吗?
2021-04-06 11:37:00
但并非所有浏览器都支持 readyState。这就是我要问的原因。
2021-04-11 11:37:00