JS的异步装载

JS的装载和执行

首先,浏览器对JS的运行分两个特性:
1)载入后马上执行;
2)执行后会阻塞后面的内容(包括页面的渲染、其他资源的下载等)
所以,有多个js文件要载入的时候,浏览器默认是同步下载,即按顺序一个一个下载下来,并依次执行。
当此时,要操作DOM结点的时候,由于HTML被阻塞,DOM树还没生成,故此时如果引用document.getElementById这些操作时,会报找不到的错误。举例:

test.js
  • 在head中引入的时候,页面加载出来了,但会报错,alert也没有出现:


    test.html

    执行结果
  • 调整script标签的顺序,到body标签后:
test.html
结果
F12查看

认识DOMContentLoaded和load

先触发DOMContentLoaded事件,后触发load事件。
DOM文档加载的步骤为:

解析HTML结构。
加载外部脚本和样式表文件。
解析并执行脚本代码。
DOM树构建完成。//DOMContentLoaded
加载图片等外部文件。
页面加载完毕。//load
在第4步,会触发DOMContentLoaded事件。在第6步,触发load事件。

defer和async

  • defer:IE上用的,会把脚本异步装载,并且等到DOM装载完毕(DOMContentLoaded)。多个defer的<script>也会按照其出现的顺序执行。

  • async:H5新的属性。也会异步加载js脚本,但严格遵循“载入后立马执行”的特性,无法保证执行顺序和时机。
    所以这两种都不会阻塞HTML的加载。

举例:

  • 加入async(或者defer)后,页面渲染不阻塞,脚本也顺利执行了(div中的文本123被获取出来了)。


    test.html

    执行结果

此外,还可以通过创建script,插入到DOM中,加载完毕后callBack来异步加载。

网上这篇帖子写的不错,可以参考一下:http://www.360doc.com/content/13/0620/12/1332348_294249608.shtml

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 简单介绍JavaScript的发展历史 JavaScript因互联网而生,回顾它的历史要从浏览器的历史讲起。 19...
    _Dot912阅读 3,424评论 0 3
  • Tif_Lib阅读 3,290评论 0 1
  • 本文总结一下浏览器在 javascript 的加载方式。关键词:异步加载(async loading),延迟加载(...
    4ea0af17fd67阅读 4,676评论 0 2
  • JavaScript脚本对现代网站来说是必不可少的。当用户访问站点,需要下载各种资源,例如JS脚本,CSS,图片,...
    张歆琳阅读 13,001评论 0 24
  • 首先我们先来看一下Script标签的各项属性: script标签也支持HTML中的全局属性: 下面我们来看看一看j...
    tobAlier阅读 4,824评论 0 2