html5_延迟(defer)脚本与异步(async)脚本

延迟脚本:

诸如以下的html文档:

<!Doctype html><html> <head> <title>延迟脚本</title> <script src="defer.js"></script> </head> <body> <div id="target"></div> </body></html>

 

其中包含的javascript代码为:

var tg=docuemnt.getElementById("target");tg.innerHTML="XX";tg.style.backgroundColor="gery";

 

以前的浏览器对文档进行解析时,当解析到<script>元素时,浏览器会做两件事:

1.停止继续解析,转而根据<script>元素的src属性下载对应的js脚本文。。

2.解析执行脚本文件。

 

当浏览器解析执行脚本文件时,文档内并没有id为”traget“的元素,也因此这段代码是错误的。

 

解决上述问题的传统做法是将<script>写在<body>内部的最后面。

而延迟脚本的作用则是与之相同,即在文档页面没有完全解析之前,不对<script>元素进行解析。

延迟脚本如下:

<script src="defer.js" defer> <!--即在script标签内写入一个defer即可-->

 

异步脚本:

当脚本解析占用太多时间时,将脚本设置为异步脚本,浏览器会对脚本解析启动新线程,使得脚本解析与文档解析可以同步进行。它的作用是避免处理脚本时间过长导致页面长时间空白。

html文档:

<!Doctype html><html><head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> <title></title> <script src="async.js"></script></head><body> <div>XX</div></body></html>

 

js代码:

for(let i=0;i<10000;i++){ //some code }

 

如上代码所示:js代码需要执行循环一万次,在循环完成之前不会向下解析。

 

异步脚本如下:

<script src="async.js" async="async">

 

 

根据红宝书的描述:

一个页面最好只有一个延迟脚本。

延迟脚本与异步脚本都只适用于外部脚本。

建议异步加载期间不要有修改DOM的行为。

相关文章