<script>标签在html页面放置位置

1.<script></script>标签放置在<head></head>标签内部时:

将script放在里,浏览器解析HTML,发现script标签时,会先下载完所有这些script,再往下解析其他的HTML。讨厌的是浏览器在下载JS时,是不能多个JS并发一起下载的。不管JS是不来来自同一个host,浏览器最多只能同时下载两个JS,且浏览器下载JS时,就block掉解析其他HTML的工作。将script放在头部,会让网页内容呈现滞后,导致用户感觉到卡。

2.<script></script>标签放置在<body></body>标签内部时:

将script放在尾部的缺点,是浏览器只能先解析完整个HTML页面,再下载JS。而对于一些高度依赖于JS的网页,就会显得慢了。所以将script放在尾部也不是最优解,最优解是一边解析页面,一边下载JS。

3.<script></script>标签放置在</body>标签之后时:

首先声明。这在之后插入其他元素,从HTML 2.0起就是不合标准的。按照HTML5标准中的HTML语法规则,如果在后再出现

第一,这是不合标准的行为,而且从有HTML标准以来都是不合标准的,因此浏览器实现不一致或者在这种情况下有bug的风险显然更大。

第二,虽然将<script>写在</body>之后,但最终的DOM树里,<script>元素还是会成为body的子节点,这一点很容易在firebug等调试器里验证。既然如此,如果将<script>写在</body>之前会有问题,你又如何保证写在之后(并在DOM里又变成了和写在之前一样的结构)就没有问题?

那最优解的一边解析页面一边下载JS应该怎样实现呢?

我们<script>标签这里面有两个属性(async和defer),现在80%的浏览器都可以识别他们,这两个属性能让浏览器做到一边下载JS(还是只能同时下载两个JS),一边解析HTML。他的优点不是增加JS的并发下载数量,而是做到下载时不block解析HTML。

 <script type="text/javascript" src="path/to/script1.js" async></script>  
 <script type="text/javascript" src="path/to/script2.js" async></script>  

如上图我们同时引入两条外部js文件时:

async属性能保证script会异步执行,只要下载完就执行,这会导致script2.js可能先于script1.js执行(如果script2.js比较大,下载慢)。
defer属性就能保证script有序执行,script1.js先执行,script2.js后执行。

上一篇:Nginx访问PHP文件的File not found错误处理


下一篇:字串处理