javascript - 代码在底部时是否需要 'onload'?

标签 javascript html onload

我想知道 window.onload = function(){} (或者任何其他类型的加载,如 jQuery $(document).ready(); 是必需的,如果代码放在我的 <body> 的底部?

或者可能会出现意想不到的副作用?

最佳答案

是的,可能会有意想不到的后果。但是,不,这不是绝对必要的。对于仍在加载的内容,如复杂的布局、深层 DOM 结构、来自其他脚本的动态 HTML 或图像,时间可能会关闭。为避免这些情况,将脚本包装在 onload 事件中始终是最安全的。

这里有一些例子可以证明这一点。所有示例都在 OS X 上的 Chrome 17.0.963.12 dev 上测试。当不使用 onload 时,浏览器结果可能会有所不同,这表明其不可预测的行为。如果结果与您的预期不同(即您的设计指定的结果),这些示例将返回 fail,如果结果与您的预期相匹配,则返回 success。使用 onload,它们总是返回 success

示例 1

在此示例中,代码期望图像具有特定宽度。如果代码包含在 onload 事件中,则宽度正确,否则不正确。

演示:http://jsfiddle.net/ThinkingStiff/qUWxX/

HTML:

<div id="result"></div>
<img id='image' src="http://thinkingstiff.com/images/matt.jpg" />

脚本:

document.getElementById( 'result' ).innerHTML 
    = document.getElementById( 'image' ).offsetWidth == 346 ? 'success': 'fail';

您会看到页面左上角的 jsFiddle 设置为“onLoad”,图像上方的结果是成功

enter image description here

将其更改为“onDomReady”或“不换行(正文)”:

enter image description here enter image description here

现在点击页面左上角的“运行”:

enter image description here

图像上方的结果现在将是失败

例子2

这是另一个不使用图像的示例。在这一个中,内联脚本已添加到 HTML 中。代码期望宽度是内联脚本设置的宽度。使用 onload 是正确的,没有则不是。在此演示中使用与之前相同的说明。

演示:http://jsfiddle.net/ThinkingStiff/n7GWt/

HTML:

<div id="result"></div>
<div id="style"></div>

<script>
    window.setTimeout( function() { 
        document.getElementById( 'style' ).style.width = '100px'; 
    }, 1 );
</script>

脚本:

document.getElementById( 'result' ).innerHTML 
    = document.getElementById( 'style' ).style.width ? 'success' : 'fail';

示例 3

这是一个在正文中不使用图像或 Javascript,仅使用 CSS 的示例。同样,onload 和 not 之间的结果是不同的。

演示:http://jsfiddle.net/ThinkingStiff/HN2bH/

CSS:

#style {
    animation:             style 5s infinite;
        -moz-animation:    style 5s infinite;
        -ms-animation:     style 5s infinite;
        -o-animation:      style 5s infinite;
        -webkit-animation: style 5s infinite;
    border: 1px solid black;
    height: 20px;
    width: 100px;    
}

@keyframes             style { 0% { width: 100px; } 100% { width: 500px; } }
    @-moz-keyframes    style { 0% { width: 100px; } 100% { width: 500px; } }
    @-ms-keyframes     style { 0% { width: 100px; } 100% { width: 500px; } }
    @-o-keyframes      style { 0% { width: 100px; } 100% { width: 500px; } }
    @-webkit-keyframes style { 0% { width: 100px; } 100% { width: 500px; } }

HTML:

<div id="result"></div>
<div id="style"></div>

脚本:

document.getElementById( 'result' ).innerHTML 
    = document.getElementById( 'style' ).clientWidth > 100 ? 'success' : 'fail';

在太多情况下,不包装代码会导致您无法预料的问题。为避免这些情况,将脚本包装在 onload 事件中始终是最安全的。

关于javascript - 代码在底部时是否需要 'onload'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8717401/

相关文章:

javascript - 带有 CSS 动画的 SVG 预加载器,在每个页面加载时随机化

Javascript - URL 的奇怪字符串比较行为

javascript - 如何在收到消息时重新加载 contentScript (page-mod)?

javascript - Facebook 插件无法在内容/模板页面上运行

javascript - 如何在加载后在中心或特定高度启动页面

javascript - 第一次在两秒内执行 window.setInterval ,然后每 10 秒调用一次

javascript - 在 Bootstrap 弹出窗口中显示 iframe

javascript - 如何在模态 Bootstrap 中发送参数?

javascript - Canvas 用二次曲线画圆

javascript - iFrame onload JavaScript 事件