我对 window.onload 事件的触发时机有点困惑。例如:我有一个页面,其中有许多外部 JavaScript 文件,甚至还有按需加载脚本(动态创建标记)。所有这些代码都在页面中(即它不会在单击或其他操作时触发,应在加载时执行)。现在假设我在最后一个按需 JavaScript 中设置了 window.onload = somefunction()。是否可能在所有脚本实际加载完成之前就触发 window.onload?
我对 window.onload 事件的触发时机有点困惑。例如:我有一个页面,其中有许多外部 JavaScript 文件,甚至还有按需加载脚本(动态创建标记)。所有这些代码都在页面中(即它不会在单击或其他操作时触发,应在加载时执行)。现在假设我在最后一个按需 JavaScript 中设置了 window.onload = somefunction()。是否可能在所有脚本实际加载完成之前就触发 window.onload?
window.onload
(也称为body.onload
)在主HTML、所有CSS、所有图像和所有其他资源加载和渲染后被触发。因此,如果你的图像停滞不前,这可能需要一些时间。
如果您只需要HTML(DOM),则可以使用jQuery的$(document).ready()
- 它会在解析HTML之后但在浏览器完成加载所有外部资源(图像和在HTML中在您的脚本元素之后的样式表)之前触发。
页面中嵌入的脚本会在浏览器解析每个</script>
时执行。因此,要在任何其他脚本之前执行脚本,请在<head>
后的第一个位置添加<script>
标记。
这意味着您可以通过将<script>
标记作为<body>
的最后一个元素来“模拟”window.onload
。
不是的。 window.onload() 会在所有资源(文档、对象、图像、css等)完成渲染时被调用。
误读了问题。是的,完全有可能在动态添加的脚本下载完成之前就触发了 window.onload 事件。使用DOM(document.createElement())添加的脚本异步下载,并且不受通常规则的限制,即 window.onload() 等待所有资源先完成下载。
我为您设置了一个测试套件,http://jsfiddle.net/ywSMW/。此脚本会动态将jQuery脚本添加到DOM中,并在 onload 处理程序期间将 $
的值写入控制台。然后再过一秒钟将该值再次写入。即使脚本被缓存,第一次写入控制台返回 undefined,这意味着在 jQuery 脚本被下载和解析之前,onload 事件已经被触发。
在IE和Chrome中进行了测试。
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
}
}
</html>
时触发,它会在所有图像、对象和其他资源都被下载和呈现后触发。你可能将其与变异事件DOMReady混淆了,后者在文档被解析后触发。此外,动态添加的脚本元素会异步下载,因此它们不受此规则的限制。 - Andy E<BODY>
元素直接设置 window.onload 处理程序,使用 onload 属性。只有当所有图像都被下载和渲染后,onload 才会触发。我相当确定这也适用于 CSS 图像。 - Andy E