【发布时间】:2018-12-21 06:27:32
【问题描述】:
大家好,我是 JavaScript 和 Web 开发的新手。我最近遇到了这个关于脚本标签位置的问题。我知道这是一个常见问题,我在 stackoverflow 上查看了一些答案,也在 google 上查看了这个风格指南。但我对这个问题还不是很清楚。
例如,我有一个带有像这样的外部脚本 js 文件的 html 页面
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title></title>
<script src='js.js'>
</script>
</head>
<body>
</body>
</html>
js文件是
var loadTime = document.createElement('div');
loadTime.textContent = 'You loaded this page on: ' + new Date();
loadTime.style.color = 'blue';
document.body.appendChild(loadTime);
在我看来,这个 js 文件不依赖于可用的 html 文件的任何 DOM 元素,所以我把这个脚本标签放在哪里应该无关紧要。但事实证明,我必须将此脚本标记放在正文结束标记的底部,否则日期不会按预期显示在页面上。另一种解决方法是在脚本标签中使用 defer 属性,如下所示
<script src='js.js' defer></script>
这让我很困惑,如果一个脚本有任何与 DOM 相关的操作,在我看来,如果没有 defer 或 async 属性,它就不能放在前面的 head 标签内。为什么这个 google 风格指南 https://developers.google.com/speed/docs/insights/BlockingJS 仍然建议我们可以在 head 标签中编写内联脚本,因为访问和操作 DOM 在任何脚本文件中都非常常见。
根据http://caniuse.com/#feat=script-defer,94.59% 的浏览器支持此功能。 94.92% 至少部分支持它。为什么 async 和 defer 属性没有被广泛使用?我的意思是,我查看了很多 HTML 源代码,但我没有在任何地方看到 async 和 defer 属性?
【问题讨论】:
-
因为我一般用jQuery,相当于forqzy的回答是把你的javascript包裹在
ready函数里:$(document).ready(function() { ... }) -
“在我看来,这个 js 文件不依赖于可用的 html 文件的任何 DOM 元素” — 脚本的最后一行非常依赖于
document.body元素,在脚本运行的 head 元素之后创建。 -
要添加到@Lennholm 的评论中,文档会自上而下逐行加载,这就是尚未创建正文的原因
标签: javascript html web