怎样理解script标签的defer属性和async属性
如果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是单独下载, 完成后立即执行.
最新文章
- java 反序列化PHP
- 2013 duilib入门简明教程 -- XML配置界面(6)
- CSS设置DIV背景色渐变
- Nginx 配置 HTTP 强缓存
- PL/SQL Developer中文版下载以及使用图解(绿色版)
- SAM4E单片机之旅——24、使用DSP库求向量数量积
- LinkedList链式集合
- IT应届生如何准备找工作?
- plantuml
- OpenJudge 2721 忽略大小写比较字符串大小
- CSS 常用命名
- Toolkit 一键激活Office 2010方法及Office 2010 Toolkit工具下载
- 怎么在ng-repeat生成的元素上操作dom
- Android Development HandBook-Android Studio 特别篇
- WordPress 4.8 安装配置教程 (基于 centos 7.3, php 7.0, mysql 5.7.19, nginx 1.12.1)
- 再见,Python!你好,Go语言
- IntelliJ IDEA 使提示不区分大小写
- OAuth2简易实战(四)-Github社交联合登录
- mysql-约束介绍
- 中文数据解码报错 UnicodeDecodeError: &#39;gbk&#39; codec can&#39;t decode bytes in position 2-3: illegal multibyte sequence
热门文章
- CodeForces - 1175D Array Splitting(数组划分+后缀和+贪心)
- html 与 xml 的区别与联系
- qt Qt5开发
- CVE-2019-11477:Linux 内核中TCP协议栈整数溢出漏洞详细分析 代码卫士 今天
- VBScript把json字符串解析成json对象的2个方法
- PHP中的符号 ->;、=>; 和 :: 分别表示什么意思?
- lvs,nginx,haproxy的优缺点,适合场景
- java通过telnet远程至windows机器执行dos命令
- windows 10 enterprize LTSC
- PAT 甲级 1046 Shortest Distance (20 分)(前缀和,想了一会儿)