为什么脚本在 body 标签的末尾

新手上路,请多包涵

我知道这个问题被问过很多次,但我还没有找到答案。那么为什么它建议在 body 标记的末尾包含脚本以更好地呈现?

来自 Udacity 课程 https://www.udacity.com/course/ud884 - 在 DOM 和 CSSOM 准备好后开始渲染。 JS 是 HTML 解析阻塞,任何脚本都在 CSSOM 准备好后启动。

所以如果我们得到:

 <html>
    <head>
        <meta name="viewport" content="width=device-width,initial-scale=1">
        <title>CRP</title>
        <link rel="stylesheet" href="styles.css">
    </head>
    <body>
        <!-- content -->
        <script src="script.js"></script>
    </body>
</html>

CRP 将是:

 CSSOM ready > JS execute > DOM ready > Rendering

如果脚本在前面:

 <html>
    <head>
        <meta name="viewport" content="width=device-width,initial-scale=1">
        <title>CRP</title>
        <link rel="stylesheet" href="styles.css">
        <script src="script.js"></script>
    </head>
    <body>
        <!-- content -->
    </body>
</html>

CRP 是一样的:

 CSSOM ready > JS execute > DOM ready > Rendering

这个问题只是关于“同步”脚本(没有异步/延迟属性)。

原文由 Artem Svirskyi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 483
2 个回答

从历史上看,脚本会阻止其他资源更快地被下载。通过将它们放在底部,您的样式、内容和媒体可以更快地下载,从而给人以改进性能的 _感觉_。

进一步阅读: asyncdefer 属性。

原文由 Sampson 发布,翻译遵循 CC BY-SA 3.0 许可协议

最好将 JavaScript 标记放在结束标记之前,而不是放在 HTML 的部分中。

这样做的原因是 HTML 从上到下加载。首先加载头部,然后是身体,然后是身体内部的所有东西。如果我们将 JavaScript 链接放在 head 部分,整个 JavaScript 文件将在加载任何 HTML 之前加载,这可能会导致一些问题。

1.如果您的 JavaScript 中有代码在加载 JavaScript 文件后立即更改 HTML,那么实际上还没有任何 HTML 元素可供它影响,因此看起来好像 JavaScript 代码不起作用,你可能会得到错误。 2.如果您有很多 JavaScript,它会明显减慢您的页面加载速度,因为它会在加载任何 HTML 之前加载所有 JavaScript。当您将 JavaScript 链接放在 HTML 主体的底部时,它会在任何 JavaScript 加载之前为 HTML 加载时间,这可以防止错误并加快网站响应时间。

还有一件事:虽然最好在 HTML 的末尾包含 Javascript,但是将 Javascript 放在 HTML 的末尾并不总是会导致错误。使用 jQuery 时,通常将所有代码放在“文档就绪”函数中:

$(“document”).ready(function(){ // 你的代码 });

这个函数基本上是说,在文档准备好或完全加载之前不要运行其中的任何代码。这将防止任何错误,但它仍然会减慢 HTML 的加载时间,这就是为什么最好在所有 HTML 之后包含脚本。

原文由 adi1ya 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题