相同点:

首先async和defer只对header里的外连脚本script标签上起作用,如果script标签是放在header外或者是header里的内置脚本以及动态生成的script标签是不起作用的。其作用是将该js脚本设置为异步加载,主要用于当外链的js文件没有操作DOM的情况。

两者区别:

使用async标志的脚步文件一旦加载完成就会立即执行;使用defer标记的脚本文件会在DOMContentloaded事件之前(也就是页面DOM加载完成时)执行。

如果有多个js脚本文件,async标记不保证按照书写的顺序执行,哪个脚本先下载结束就先执行哪个脚本。而defer标记则会按照js脚本书写顺序执行。

一般来说,如果脚本之间没有依赖关系,就使用async属性,如果脚本之间有依赖关系,就使用defer属性。如果同时使用async和defer属性,后者不起作用,浏览器的行为由async属性决定。

对于async标记,浏览器的解析过程是这样的:

  • 浏览器开始解析html网页
  • 解析过程中,发现带有async属性的script标签
  • 浏览器继续往下解析html网页,同时并行下载script标签中的外部脚本
  • 脚本下载完成,浏览器暂停解析html网页,开始执行下载的脚本
  • 脚本执行完毕,浏览器恢复解析html网页

对于defer标记,浏览器的解析过程:

  • 浏览器开始解析html网页
  • 解析过程中,发现带有defer属性的script标签
  • 浏览器继续往下解析html网页,同时并行下载script标签中的外部脚本
  • 浏览器完成解析html网页,此时再执行下载的脚本

当header中同时有js脚本和外链css时,js脚本最好放外链css前面。因为如果脚本的内容是获取元素的样式,宽高等css控制的属性,浏览器是需要计算的,也就依赖于css。浏览器无法感知脚本内容到底是什么,为避免样式获取错误,因而只好等前面的所有样式下载完后,再执行js。如果css下载时间很长的话,js也无法正常运行,导致html无法正常解析出来,

转自:https://www.cnblogs.com/lvonve/p/11975593.html

html中script标签使用async属性和defer属性的区别的更多相关文章

  1. 【javascript】script标签的async异步解析

    <script src="script.js"></script> 没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染 ...

  2. html中script标签的使用方法

    向HTML页面中插入JavaScript的主要方法,就是使用<script>元素.这个元素由Netscape创造并在Netscape Navigator2中首先实现.后来,这个元素被加入到 ...

  3. script标签的async和defer

    兼容性 IE对于defer一直都支持,async属性IE6-9都没有支持,IE10及以上支持 相同点与不同点 带有async或defer的script都会立刻下载并不阻塞页面解析,而且都提供一个可选的 ...

  4. JS添加验证页面中script标签中是否存在jquery文件

    window.onload = function() { var al = document.getElementsByTagName("script"); var new_ele ...

  5. html文件中script标签放在哪里?

  6. JavaScript <script>标签的位置、延迟脚本(defer属性)与 异步脚本(async属性)

    一.<script>标签的位置 传统的做法是将<script>元素放在<head>元素中,例如: <!DOCTYPE html><html > ...

  7. html5中script的async属性

    html5中script的async属性 我兴奋于html5的原因之一是一些久久未能实现的特性现在可以真正运用于实际项目中了. 如我们使用placeholder效果蛮久了但是那需要javascript ...

  8. 怎样理解script标签的defer属性和async属性

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

  9. script标签加载顺序(defer & async)

    script 拥有的属性 async:可选,表示应该立即下载脚本,但不应妨碍页面中的其他操作,比如下载其他资源或等待加载其他脚本.只对外部脚本文件有效. charset:可选.表示通过 src 属性指 ...

随机推荐

  1. mysql 误删除所有用户或者忘记root密码

    /etc/init.d/mysqld stop //停止数据库/etc/init.d/mysqld restart //启动数据库(1)开启特殊启动模式mysqld_safe --skip-grant ...

  2. Netty解码器相关文章

    最通用TCP黏包解决方案:LengthFieldBasedFrameDecoder和LengthFieldPrepender https://blog.csdn.net/u010853261/arti ...

  3. 关于IC电源管脚去耦电容

    原文地址:https://mp.weixin.qq.com/s/0dAyTpAcQWXlYULqCeKgFA 每个集成电路(IC)都必须使用电容将各电源引脚连接到器件上的地,原因有二:防止噪声影响其本 ...

  4. C# Socket TcpClient 无法从传输连接中读取数据: 远程主机强迫关闭了一个现有的连接。。

    开始的代码: byte[] data = Encoding.UTF8.GetBytes(sInfo);                    tcpns.Write(data, 0,1024); 修改 ...

  5. 一百三十三:CMS系统之版块管理一

    把模型创建到公共的models里面 class BoardModel(db.Model): __tablename__ = 'board' id = db.Column(db.Integer, pri ...

  6. python3 super().__init__() 和 __init__() 的区别

    1.单继承 super().__int__()和 Base.__init__(self)是一样的, super()避免了基类的显式调用. class Base(object): def __init_ ...

  7. 修改IDEAL 快捷键风格

    选择File------Setting-----进入到设置窗口-------keymap--------选择自己适应的快捷键风格 选择Eclipse后Ideal的快捷键就和Eclipse相同

  8. Linq Introduce

    Linq学习网址: http://www.java2s.com/Code/CSharp/LINQ/CatalogLINQ.htm

  9. python基础----条件判断与循环

    一.python数据类型 1.整数(包括整数.负数) 2.浮点数(小数) 3.字符串(需要用单引号‘’或双引号“”括起来) 注:当字符串中含有单引号时,用双引号括起来(now="let's ...

  10. Flutter路由_fluro引入配置和使用

    Flutter本身提供了路由机制,作个人的小型项目,完全足够了.但是如果你要作企业级开发,可能就会把入口文件变得臃肿不堪.而再Flutter问世之初,就已经了企业级路由方案fluro. flutter ...