当window.onload被解雇
我有点困惑,当window.onload事件被激发。 例如:我有一个页面,有很多外部js文件,甚至按需加载的脚本(dynamic创build一个标签)。 所有这些代码都在页面中(也就是说,它不会被点击或者失败,它应该在加载时执行)。 现在让我们说,我有最后一个按需javascript的window.onload = somefunction()。 是否有可能在所有脚本实际上被加载之前,window.onload会被触发?
window.onload
(又名body.onload
)在主HTML,所有CSS,所有图像和所有其他资源已经被加载和渲染后被触发。 所以,如果你的图片失速,可能需要一些时间。
如果你只是需要HTML(DOM),你可以使用jQuery的$(document).ready()
– 当HTMLparsing之后,浏览器完成加载所有的外部资源(图片和样式表你的脚本元素在HTML中 )。
embedded在页面中的脚本在浏览器parsing每个</script>
的</script>
时被执行。 因此,要在任何其他脚本之前执行脚本,请在<head>
之后的标题中添加<script>
标记。
这意味着你可以通过添加一个<script>
标签作为<body>
的最后一个元素来“模拟” window.onload
。
当所有资源(文档,对象,图像,CSS等)完成渲染时,将调用window.onload() 。
错误的问题。 是的,在dynamic附加脚本完成下载之前, window.onload事件完全可能会触发。 使用DOM( document.createElement() )添加的脚本asynchronous下载,不受通常的规则,即window.onload()等待所有资源首先完成下载。
我为你设置了一个testing套件, http://jsfiddle.net/ywSMW/ 。 该脚本dynamic地将jQuery脚本添加到DOM,并在onload处理程序中将$
的值写入控制台。 然后在一秒钟之后再次写入该值。 即使脚本被caching,第一次写入控制台也会返回undefined ,这意味着onload在jQuery脚本被下载和parsing之前甚至已经被触发。
在IE和Chrome中testing
Re:评论,如果你想检查onload事件是否已经被触发,你可以在onload处理器中设置一个全局variables的值:
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 } }