https://www.cnblogs.com/huangtq/p/18422775

在 <script> 标签中,defer 和 async 是两个用于控制 JavaScript 脚本加载和执行行为的属性。它们的主要区别在于加载顺序执行时机。具体如下:

1. defer 属性

  • 加载方式: 使用 defer 的脚本在 HTML 解析的同时异步加载。
  • 执行顺序: 所有带有 defer 的脚本会按照它们在页面中的出现顺序依次执行。
  • 执行时机: 脚本会在 HTML 文档解析完毕后执行,也就是在 DOMContentLoaded 事件触发之前,但不会阻塞页面的解析。
  • 适用场景: 当脚本依赖于 DOM 结构时,使用 defer 是理想的,因为它保证了脚本执行时 DOM 已经完全加载完成。

例子:

<script src="example.js" defer></script>

2. async 属性

  • 加载方式: 使用 async 的脚本也会异步加载,与 HTML 解析同时进行。
  • 执行顺序: 脚本会在加载完成后立即执行,不保证按照它们在页面中的出现顺序执行。
  • 执行时机: 一旦脚本加载完成,就会立即执行,可能会在 HTML 解析完成之前执行,也可能在解析过程中执行。
  • 适用场景: 用于独立、不依赖于其他脚本或 DOM 内容的脚本,例如分析工具或广告脚本,因为它们可以尽快执行而不影响页面的解析。

例子:

<script src="example.js" async></script>

区别总结:

  • 加载顺序async 无序(哪个脚本先加载完哪个先执行),defer 有序(按照 HTML 中的顺序执行)。
  • 执行时机async 脚本一旦加载完成立刻执行,defer 脚本会在 HTML 解析完成之后执行。

执行时机图示:

  1. 普通 <script> 标签:同步加载,立即阻塞 HTML 解析,加载完毕后执行。
  2. defer 脚本:异步加载,不阻塞 HTML 解析,等 HTML 全部解析完后按顺序执行。
  3. async 脚本:异步加载,不阻塞 HTML 解析,但加载完毕后立即执行,且无序。

哪个更好?

  • 当脚本依赖于页面的 DOM 结构时,使用 defer 更安全。
  • 当脚本与其他脚本和页面结构无关时,可以使用 async 以加快加载和执行速度。

script 标签中 defer 和 async 的区别的更多相关文章

  1. script标签中defer和async的区别(稀土掘金学习)

    如果没有defer或async属性,浏览器会立即加载并执行相应的脚本.它不会等待后续加载的文档元素,读取到就会开始加载和执行,这样就阻塞了后续文档的加载. 下图可以直观的看出三者之间的区别: 其中蓝色 ...

  2. script标签中defer和async属性的区别

    这篇文章来源于JS高级程序设计第三版中关于script标签的介绍,结合查阅的资料写下的学习笔记. 向html页面中插入javascript代码的主要方法就是通过script标签.其中包括两种形式,第一 ...

  3. HTML <script> 标签的 defer 和 async 属性

    HTMKL <script>标签中有defer和async属性,简单介绍一下两者的区别吧.   普通的script标签会让浏览器立即下载并执行完毕,执行也是按照先后顺序,再进行后面的解析. ...

  4. script标签的defer、async属性

    之前一直对script标签的defer.async属性一知半解,直到看到了论坛上某大神发的图片,茅塞顿开!!!!!

  5. HTML中script 标签中的那些属性

    在HTML中, <script> 标签用于嵌入或引用JavaScript代码. 在 <script> 标签中,有两个属性可以用来控制脚本的加载和执行方式: async 和 de ...

  6. <script>标签里的defer和async属性 区别(待补充)

    defer与async的区别(表格显示): table th:first-of-type { width: 150px; } table th:nth-of-type(2) { } 区别 defer ...

  7. script标签中的async、defer属性

    Script标签是我们常用的引用js脚本的一种方式. 撸代码的时候,我们常常只写src属性,直接忽略其他属性. 最近发现了2个可以利用的属性:async.defer. 顾名思义async就是异步,在不 ...

  8. url,href和src的区别,defer和async的区别

    URL(Uniform Resource Locator):统一资源定位符,互联网上的每个文件都有一个唯一的URL,基本URL包含协议,IP地址,路径和文件名. 重点:herf和src的区别 href ...

  9. 关于html中的 script标签中的 代码写法有效性? easyui tabs的href不能载入内容页面

    script标签, 即 html中的 js脚本区域中: 它其实就是一个 普通的 html标签, 在 html 渲染器 parser 看来, 它跟其他任何的普通 的 html标签 , 比如 p 标签, ...

  10. javaScript中的小细节-script标签中的预解析

    首先介绍预解析,虽然预解析字面意思很好理解,但是却是出坑出的最多的地方,也是bug经常会有的地方,利用好预解析的特性可以解决很多问题,并且提高代码的质量及数量,浏览器在解析代码前会把变量的声明和函数( ...

随机推荐

  1. eShopOnContainer 中 Grpc 服务定义与实现

    eShopOnContainer 中 Grpc 服务定义与实现 服务于前端的后端 (BFF) 模式是 API 网关模式的一种变形,针对外部使用者的不同需求,为每种不同的客户端使用者提供一种后端 API ...

  2. 程序员出海做 AI 工具:如何用 similarweb 找到最佳流量渠道?

    如题,今天给大家带来实操的一个小教程.这里先抛出个问题:"做海外流量增长,如何为产品制定营销渠道?" 分享一个方法只需要 3 步,方法如下: 找到和你产品最接近的细分 Top 竞争 ...

  3. 【Javaweb】在项目中添加MyBatis依赖等

    pom.xml 仓库 如果你没有配置阿里云仓库镜像源,可以到这里来找 https://mvnrepository.com/ 如果你配置了阿里云仓库镜像源,可以来这里找 https://develope ...

  4. Mac 配置多版本JDK

    @ 目录 前言 一.下载并安装多个JDK版本 二.配置环境变量 三.切换JDK版本 四.下篇预告!!! 总结 前言 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i. 提示:以下是本篇文章正文 ...

  5. fatal: repository 'http:/xxxx/root/x.git/' not found

    我遇到的问题其实就是gitlab旧服务器迁移到新服务器之后用户的没权限了没有权限操作了 所以抛出该异常 解决办法是赋予新的权限

  6. Qt开源作品41-网络调试助手增强版V2022

    一.前言 做网络通信少不了网络收发数据,经常用到网络数据的调试相关工具,以便侦听数据用来判断数据是否正确,许久以前就发布过类似的工具,第一版大概在2013年,第二版大概在2017年,中间参考过不少的网 ...

  7. MyBatis中的 10 个宝藏技巧!

    前言 说到 MyBatis,很多小伙伴都会用,但未必用得"惊艳". 实际上,这个轻量级的持久层框架还有很多隐藏的"宝藏技巧". 如果你能掌握这些技巧,不但能让开 ...

  8. 引发类型为“System.Windows.Forms.AxHost+InvalidActiveXStateException”的异常 解决办法

    出现题目的异常,多是引用第三方控件引起的. 在NEW时,需要初始化该对象. AxESACTIVEXLib.AxESActiveX ax = new AxESACTIVEXLib.AxESActiveX ...

  9. Codeblocks 显示所创建工程的文件夹

    问题: 有时创建完工程后没有默认打开文件夹: 方法: 使用F2 +shift view->manager

  10. 如何解决:Android Studio (version 4.1); Flutter plugin not installed and Dart plugin not installed errors

    出现的现象 android studio 4.1已经安装了flutter和dart插件,但是执行 flutter doctor依然报错. [!] Android Studio (version 4.1 ...