script 标签中 defer 和 async 的区别

news/2024/9/20 16:44:54/文章来源:https://www.cnblogs.com/huangtq/p/18422775

<script> 标签中,deferasync 是两个用于控制 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 以加快加载和执行速度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/800592.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle 19C重启库后警告日志报错ORA-12012ORA-27476: SYS.MAX_JOB_SLAVE_PROCESSES does not exist

Oracle 19C重启库后警告日志报错ORA-12012&&ORA-27476: "SYS"."MAX_JOB_SLAVE_PROCESSES" does not exist某次测试机器的19c重启后突然在警告日志定时冒出如下类似的报错:2024-09-20T15:20:00.170202+08:00 TESTDB(7):Errors in file /u01/app/or…

【Swagger】2.不在生产环境暴露,可以修改默认地址

不对外暴露接口 一般来说,接口给内部人员使用和测试的,不对生产环境暴露。此时应该如何设置呢?可以在Swagger配置文件中添加注解:@Profile({"环境名称1","环境名称2"} 或@Profile("环境名称") 这里,注解中不添加生产环境。 此时,开发环境和…

SMT丨工艺特点及详细生产工艺流程

SMT丨工艺特点及详细生产工艺流程 表面组装技术SMT现状 SMT是目前电子组装行业里最流行的一种技术和工艺。自70年代初推向市场以来,SMT已逐渐替代传统"人工插件"的波峰焊组装方式,已成为现代电子组装产业的主流,人们称为电子组装技术的第二次革命。在国际上,这种…

【Swagger】2.——不在生产环境暴露,可以修改默认地址

不对外暴露接口 一般来说,接口给内部人员使用和测试的,不对生产环境暴露。此时应该如何设置呢?可以在Swagger配置文件中添加注解:@Profile({"环境名称1","环境名称2"} 或@Profile("环境名称") 这里,注解中不添加生产环境。 此时,开发环境和…

文件上传漏洞思路详解

1. 文件上传漏洞简介 1.1 什么是文件上传漏洞 文件上传漏洞是一种常见的Web应用程序漏洞,攻击者可以通过向目标服务器上传恶意文件来实现攻击目的。这类漏洞的产生通常是因为服务器没有对用户上传的文件进行充分的安全检查和验证。 1.2 文件上传漏洞有哪些危害 1. 恶意代码执行…

信息学奥赛初赛天天练-93-CSP-S2023阅读程序3-sort排序、同底对数求和、二分查找、二分答案

2023 CSP-S 阅读程序2 判断题正确填 √,错误填 ⨉ ;除特殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分) 01 #include <vector> 02 #include <algorithm> 03 #include <iostream> 04 05 using namespace std; 06 07 bool f0(vector<int> &a…

缓存

Django4中的缓存 详细文档参考:https://www.cnblogs.com/Neeo/articles/17589834.html Django支持的缓存有好几种:三方的Redis(推荐),Memcached(不推荐) 缓存到本地文件 缓存到本地数据库 缓存到内存里 虚拟缓存缓存的粒度 局部视图缓存 缓存指定的视图函数,有两种写法.在视…

VSCode 定义代码模板

在使用编写代码的过程中,经常会写一些固定代码段。 以 Java 为例,定义实体类时一般都会编写序列化版本号: @Serial private static final long serialVersionUID = 1L;这段代码是固定写法,基本不会变,如果每次都手写的话,就比较繁琐了。 VSCode 提供了生成代码段的功能,…

轻松部署!龙蜥操作系统安装Zabbix7.0详细教程

龙蜥操作系统(Anolis OS)作为龙蜥社区发行的开源Linux发行版,以其稳定、高性能、安全、可靠和100%兼容CentOS 8软件生态的特点,成为众多企业和开发者的首选操作系统。它不仅支持多计算架构,如X86、ARM、RISC-V等,还针对云端场景进行了优化,为云上典型场景带来显著的性能…

WPF 隐藏listview控件的滚动条

两种方式:需要自行验证,对控件,那个有效,那个没效对于不可控的事情,保持乐观; 对于可控的事情,保持谨慎

前端实现文件导出

在后台管理系统中,我们经常会遇到文件导出这个需求,下面,我将几种常见的导出方式做一个简单的介绍,让大家在以后遇到此类需求时,能够切合实际情况,采取相对合理的方式。 导出目标 文件地址已经存在服务器上的静态文件,比如用户上传的图片、材料等等。http://192.168.1.1…

JavaScript拆分字符串时产生空字符的原因

问题描述 使用JavaScript的split方法拆分字符串时出现一些空字符串"",尤其是当使用正则表达式作为分隔符的时候。 相关问题javascript正则表达式对字符串分组时产生空字符串组?在上面这个问题中,题主使用正则表达式对字符串进行分割时产生了多个空字符串"&qu…