HTML5:为什么脚本标签需要放在body标签的末尾,而不是body标签的开始
HTML5: Why does a script tag need to be placed at the end of body tag instead of at the beginning of the body tag?
在编写HTML页面时,一些站点建议将脚本写在BODY标签的末尾,而不是BODY标签的开始。我读到这将提高页面刷新的性能。但是,当只有在DOM解析了所有标记之后才呈现HTML页面时,这有什么帮助呢?
将依赖项(如jQuery)放在head标签中是惯例。但是,如果不将DOM加载到窗口中,脚本就无法访问它。
请看下面的例子:
<!DOCTYPE html>
<head>
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js
</script>
</head>
<script type="text/javascript">
$('#appleTest').html("Apples are great.");
</script>
<body>
<div id="appleTest">
</div>
</body>
如果你运行这个,你不会看到"苹果很棒"。',因为jQuery选择没有任何东西可选择。如果您将脚本移动到</body>
标记的下方,当调用jQuery选择器方法时,它可以找到div,因为它已经加载到窗口中。
JavaScript加载不是DOM的一部分,但它会阻塞,并且会中断加载过程,直到加载完成。即使它是一个小脚本,它仍然是一个额外的请求,并且会减慢整个过程。
事实是浏览器只需要DOM结构就可以开始呈现。它们不需要脚本,也不考虑布局目的。在执行之前,它们只是一个累赘。
甚至CSS在初始呈现过程中也可能被认为是不必要的(或多或少),但由于CSS加载是非阻塞的,这不是问题。
将脚本放在底部所获得的性能增益可能会有所不同,即使这是一种推荐的做法,它也可能并不总是无害的。例如,在处理cms时,您可能会将主题设计为在底部加载脚本,但无法控制插件。例如,这种情况在WordPress中经常发生,人们最终将脚本放在头部以避免与插件冲突。
附送的歌曲
当涉及到跟踪脚本,如mixpanel, inspectlet,甚至谷歌分析…您可能希望检测用户何时进入您的页面并在几秒钟后离开,因为加载时间缓慢,成人广告块……无论什么。
如果你把跟踪脚本和底部,它可能无法及时启动检测访问,所以你不会知道你有这样一个极端的跳出率。在这种情况下,我会考虑将脚本放在头部。
如果你把资源提示放在开头,写
<link rel="preconnect" href="https://api.mixpanel.com" />
<link rel="preconnect" href="https://cdn.mxpnl.com/" />
或
<link rel="prefetch" href="https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js" as="script">
它将减轻在头部加载上述脚本的缺点
这很有帮助,因为HTML页面不是在DOM准备好之后才呈现的:浏览器在解析DOM时开始呈现页面。
这意味着您可以通过让浏览器最后加载脚本来实现更快的页面"加载"(即使DOM还没有准备好)。用户可以看到你的页面,甚至与它交互,在最后的脚本被加载。
当然,如果您的页面都是用脚本构建的,那么用户就不会看到太多内容。
- '这'内部'body'标签
- jQuery.filter可以在body标签上工作吗?
- JSF 中的 JavaScript - “body onload=” vs 标签
- 如何删除“;显示:无”;从我的html和body标签
- 在头中包含JS或在打开body标签后立即包含JS
- document.ready 当 jQuery 在 body 标签之前
- Body OnClick不会'不起作用..但是onclick在连接到<a>标签
- 从网站获取body标签值
- 使用jQuery删除iframe中的body标签
- jQuery获取正文中的html以及body标签
- HTML5:为什么脚本标签需要放在body标签的末尾,而不是body标签的开始
- 直接从body标签中删除没有被另一个父HTML元素包装的元素
- 如何从HTML标签BODY或Div解析cid值
- Wicket 1.5 Javascript文件在Body标签
- 在body标签内声明函数会导致“函数未定义”
- 如何在WordPress中关闭/body标签后添加Javascript
- 地方& # 39;脚本# 39;在BODY标签结束前使用jQuery
- HTML 'body'标签有一个onblur事件
- 如何使用javascript获取body标签的值
- 为什么必须在body标签中初始化全局变量,而不是在header中初始化全局变量?