如果script标签是引用的外部js文件, 那就会有一个下载js文件这一过程, 为了不因为这个下载过程而阻塞页面解析与渲染, 我们需要一种机制来解决这一问题, 方法之一就是使用 defer和async属性.

方法1. 使用 defer属性

defer属性的作用是延迟脚本的执行, 只有等到DOM生成之后才会执行脚本. 类似在DOMContentLoaded事件下添加监听函数.

// test1.js
// console.log(document.body.nodeName); // test1.html
<!DOCTYPE html>
<html lang="zh"> <head>
<script defer src="./test1.js"></script>
</head> <body>
</body> </html>

defer 属性的运行流程主要有下面几步: 

1. 浏览器下载的同时解析html

2. 发现带有defer的script标签时, 会在下载html的同时下载这个script标签的外部js文件

3. 下载并解析html完成后会触发 DOMContentLoaded事件, 但在这个事件触发之前, 带defer的js文件就会开始执行.

注意:

1. 多个带defer的script标签的最终执行顺序是跟它们在html中出现的先后顺序严格对应的

2. 对于不是加载外部js文件和动态生成的script文件, defer属性不生效

3. 使用defer加载的外部脚本不应该使用document.write()方法.

方法2. 使用async属性

async属性和defer属性都能解析加载script外部js文件引起的阻塞问题, 不过defer属性是在DOM载入完成以后才会执行, 而async是另开一个进程去下载脚本, 下载完成以后立刻执行, 执行的时候是会暂停解析的.

也就是说: async解决阻塞的方法是: 另开一个进程下载脚本, 这样就不会阻塞主进程html网页的解析.

// test1.js
// console.log("defer是DOM载入完成后执行.") // test2.js
// console.log("async是新开一个进程, 下载完成后就暂停主进程的解析, 执行下载的脚本.") <!DOCTYPE html>
<html lang="zh"> <head>
<script defer src="./test1.js"></script>
<script async src="./test2.js"></script>
</head> <body>
</body> </html>

注意: 

1. 使用async不能保证脚本的执行顺序, 而是谁先下载完, 就先执行谁, 因此async适用于脚本直接没有依赖关系的情况. 反之在用defer;

2. 如果一个scritp标签同时有defer和async属性, 则defer失效, script的行为由async决定;

3. 在脚本中还是不能使用document.write()方法.

总结起来, defer和async区别在于, 前者是在html解析完毕后按顺序执行, 而async是单独下载, 完成后立即执行.

最新文章

  1. java 反序列化PHP
  2. 2013 duilib入门简明教程 -- XML配置界面(6)
  3. CSS设置DIV背景色渐变
  4. Nginx 配置 HTTP 强缓存
  5. PL/SQL Developer中文版下载以及使用图解(绿色版)
  6. SAM4E单片机之旅——24、使用DSP库求向量数量积
  7. LinkedList链式集合
  8. IT应届生如何准备找工作?
  9. plantuml
  10. OpenJudge 2721 忽略大小写比较字符串大小
  11. CSS 常用命名
  12. Toolkit 一键激活Office 2010方法及Office 2010 Toolkit工具下载
  13. 怎么在ng-repeat生成的元素上操作dom
  14. Android Development HandBook-Android Studio 特别篇
  15. WordPress 4.8 安装配置教程 (基于 centos 7.3, php 7.0, mysql 5.7.19, nginx 1.12.1)
  16. 再见,Python!你好,Go语言
  17. IntelliJ IDEA 使提示不区分大小写
  18. OAuth2简易实战(四)-Github社交联合登录
  19. mysql-约束介绍
  20. 中文数据解码报错 UnicodeDecodeError: &#39;gbk&#39; codec can&#39;t decode bytes in position 2-3: illegal multibyte sequence

热门文章

  1. CodeForces - 1175D Array Splitting(数组划分+后缀和+贪心)
  2. html 与 xml 的区别与联系
  3. qt Qt5开发
  4. CVE-2019-11477:Linux 内核中TCP协议栈整数溢出漏洞详细分析 代码卫士 今天
  5. VBScript把json字符串解析成json对象的2个方法
  6. PHP中的符号 -&gt;、=&gt; 和 :: 分别表示什么意思?
  7. lvs,nginx,haproxy的优缺点,适合场景
  8. java通过telnet远程至windows机器执行dos命令
  9. windows 10 enterprize LTSC
  10. PAT 甲级 1046 Shortest Distance (20 分)(前缀和,想了一会儿)