美文网首页
JS的异步装载

JS的异步装载

作者: zhangivon | 来源:发表于2017-05-13 14:12 被阅读27次

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

相关文章

网友评论

      本文标题:JS的异步装载

      本文链接:https://www.haomeiwen.com/subject/rtexxxtx.html