在前端开发中,<script> 标签的 asyncdefer 属性会显著影响 JavaScript 脚本的加载和执行时机。下面结合示例代码,详细解析它们之间的区别:

1. 默认情况(无 async/defer

<script src="script.js"></script>
特性
  • 阻塞渲染:浏览器遇到 <script> 标签后,会立即暂停 HTML 解析,下载并执行脚本,直到脚本执行完毕才继续解析 HTML。
  • 执行顺序:按照标签在 HTML 中的出现顺序执行。
  • 适用场景:需要立即执行的脚本,或依赖于当前 DOM 的脚本。
示例
<!DOCTYPE html>
<html>
<head><title>默认脚本加载</title>
</head>
<body><div id="app">加载中...</div><!-- 阻塞渲染,直到 script.js 下载并执行完毕 --><script src="script.js"></script><div>其他内容</div>
</body>
</html>

2. async 属性

<script async src="script.js"></script>
特性
  • 异步下载:脚本的下载与 HTML 解析同时进行,不会阻塞渲染。
  • 立即执行:脚本下载完成后,会立即暂停 HTML 解析并执行脚本。
  • 执行顺序不确定:多个 async 脚本的执行顺序取决于下载完成的时间,与标签顺序无关。
  • 适用场景:独立的、不依赖于其他脚本或 DOM 的异步脚本(如广告、分析工具)。
示例
<!DOCTYPE html>
<html>
<head><title>async 脚本加载</title>
</head>
<body><div id="app">加载中...</div><!-- 不阻塞渲染,下载完成后立即执行 --><script async src="analytics.js"></script><div>其他内容</div>
</body>
</html>

3. defer 属性

<script defer src="script.js"></script>
特性
  • 异步下载:脚本的下载与 HTML 解析同时进行,不会阻塞渲染。
  • 延迟执行:脚本会在 HTML 解析完成后、DOMContentLoaded 事件触发前执行。
  • 执行顺序确定:多个 defer 脚本按标签在 HTML 中的出现顺序执行。
  • 适用场景:需要操作 DOM 或依赖于其他脚本的库(如 jQuery)。
示例
<!DOCTYPE html>
<html>
<head><title>defer 脚本加载</title><!-- defer 脚本会在 HTML 解析完成后按顺序执行 --><script defer src="jquery.js"></script><script defer src="app.js"></script>
</head>
<body><div id="app">内容</div>
</body>
</html>

ps:

在浏览器解析 HTML 的过程中,defer 脚本的执行先于 DOMContentLoaded 事件

执行顺序原理

  1. defer 脚本的特性

    • 带有 defer 属性的脚本会与 HTML 解析并行下载(不阻塞解析)。
    • 下载完成后不会立即执行,而是等待整个 HTML 文档解析完成(即 DOM 构建完成)后,再按脚本在 HTML 中的顺序依次执行。
  2. DOMContentLoaded 事件的触发时机

    • 当整个 HTML 文档解析完成(DOM 树构建完毕),且所有 defer 脚本执行完成后,才会触发 DOMContentLoaded 事件。

示例验证

<!DOCTYPE html>
<html>
<head><!-- defer 脚本:在 HTML 解析完成后执行 --><script defer src="defer-script.js"></script><script>// 监听 DOMContentLoaded 事件document.addEventListener('DOMContentLoaded', () => {console.log('DOMContentLoaded 事件触发');});</script>
</head>
<body><h1>测试执行顺序</h1>
</body>
</html>
// defer-script.js
console.log('defer 脚本执行');
输出顺序:
defer 脚本执行
DOMContentLoaded 事件触发

结论

defer 脚本的执行先于 DOMContentLoaded 事件
defer 的设计初衷就是保证脚本在 DOM 就绪后、DOMContentLoaded 之前执行,适合需要操作 DOM 且依赖执行顺序的场景(如加载 jQuery 后再执行依赖它的代码)。

执行时机对比图

HTML 解析         |---------------------------->|
默认脚本          |    下载并执行    |
async 脚本        |      下载       | 执行 |
defer 脚本        |      下载       |       | 执行
DOMContentLoaded  |---------------------------->|

关键区别总结

特性默认(无属性)asyncdefer
是否阻塞渲染
下载时机HTML 解析暂停与 HTML 解析并行与 HTML 解析并行
执行时机下载后立即执行下载完成后立即执行HTML 解析完成后执行
执行顺序按标签顺序不确定(下载完成顺序)按标签顺序
DOM 依赖需确保 DOM 已加载不依赖 DOM可依赖 DOM

最佳实践

  1. 优先使用 defer:对于需要操作 DOM 或依赖于其他脚本的代码,使用 defer
  2. 使用 async 加载独立脚本:对于不依赖其他资源的异步脚本(如第三方库),使用 async
  3. 内联脚本避免使用 async/deferasyncdefer 仅对外部脚本(src 属性)有效,对内联脚本无效。

兼容性

  • asyncdefer 均支持现代浏览器及 IE10+。
  • 若需兼容 IE9 及以下版本,需使用默认加载方式或通过 JavaScript 动态加载脚本。

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

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

相关文章

Vue.js:从 Web 到桌面的跨端实践与技术选型指南

一、Vue.js 的核心能力边界 作为渐进式 JavaScript 框架,Vue.js 的核心价值在于构建现代 Web 用户界面: ✅ 前端核心场景:单页应用(SPA)、动态交互界面、可复用组件开发 ❌ 架构限制:无法直接改造 B/S(浏览器/服务器)为 C/S(客户端/服务器)架构 关键差异:B/S 依赖浏…

SSRF11 各种限制绕过之DNS rebinding 绕过内网 ip 限制

ssrf漏洞在厂商的处理下可能进行一些特殊处理导致我们无法直接利用漏洞 有以下四种&#xff1a; 1.ip地址限制绕过 2.域名限制绕过 3.30x跳转绕过域名限制 4.DNS rebinding绕过内网ip限制 本章我们讲DNS rebinding 绕过内网 ip 限制 DNS rebinding 绕过内网 ip 限制 假…

FreeRTOS之链表操作相关接口

FreeRTOS之链表操作相关接口1 FreeRTOS源码下载地址2 任务控制块TCB2.1 任务控制块TCB2.1.1 任务控制块的关键成员2.1.2 TCB 的核心作用2.2 ListItem_t2.3 List_t3 函数接口3.1 vListInitialise3.2 vListInitialiseItem1 FreeRTOS源码下载地址 https://www.freertos.org/ 2 …

项目一第一天

目录 总结MySQL&#xff1a; 最终还是得按照SQL的语法来实施。 1、MySQL的数据类型&#xff1a;指业务数据按照什么格式存储在数据库中的。 任何数据类型最常见的三种&#xff1a;字符串、整型和小数型。 如&#xff1a;宝贝计划这种存在视频的项目&#xff0c;你们的视频是存放…

STM32第二十天 ESP8266-01S和电脑实现串口通信(3)

1&#xff1a;透传透传&#xff08;又称透明传输&#xff09;是一种通信模式&#xff0c;其核心特点是&#xff1a;通信设备对传输的数据不做任何解析或处理&#xff0c;仅作为“管道”原封不动地转发数据&#xff0c;仿佛数据“透明”地穿过设备。透传的本质关键特征说明无协议…

微服务引擎 MSE 及云原生 API 网关 2025 年 3 月产品动态

点击此处&#xff0c;了解微服务引擎 MSE 产品详情。

在 Docker 上安装和配置 Kafka、选择用于部署 Kafka 的操作系统

消息代理是一种软件&#xff0c;充当在不同应用程序之间发送消息的中介。它的功能类似于服务器&#xff0c;从一个应用程序&#xff08;称为生产者&#xff09;接收消息&#xff0c;并将其路由到一个或多个其他应用程序&#xff08;称为消费者&#xff09;。消息代理的主要目的…

2D下的几何变换(C#实现,持续更新)

&#xff08;1&#xff09;已知2D下&#xff0c;新坐标系的原点、X轴方向向量、Y轴方向向量在原始坐标系下的表示&#xff0c;求原始坐标系中直线&#xff0c;在新坐标系下的直线方程&#xff1b;&#xff08;2&#xff09;求直线与2D包围盒的交点&#xff0c;可能有0、1或2个交…

Pandas-特征工程详解

Pandas-特征工程详解一、特征工程的核心目标二、数据类型与基础转换1. 数值型特征&#xff1a;类型优化与异常处理2. 分类型特征&#xff1a;编码与规范化&#xff08;1&#xff09;标签编码&#xff08;Label Encoding&#xff09;&#xff08;2&#xff09;独热编码&#xff…

pip install torch各种版本的命令及地址

一、遇到的问题&#xff1a;cuda和torch编译时的版本不一致 在安装mmcv时遇到error MMCV_WITH_OPS1 python setup.py develo RuntimeError: The detected CUDA version (11.3) mismatches the version that was used to compile PyTorch (10.2). Please make sure to use th…

【spring boot】三种日志系统对比:ELK、Loki+Grafana、Docker API

文章目录**方案 1&#xff1a;使用 ELK&#xff08;Elasticsearch Logstash Kibana&#xff09;****适用场景****搭建步骤****1. 修改 Spring Boot 日志输出****2. 创建 Docker Compose 文件****3. 配置 Logstash****4. 启动服务****方案 2&#xff1a;使用 Loki Grafana***…

Cesium加载3DTiles模型并且重新设置3DTiles模型的高度

代码&#xff1a; 使用的时候&#xff0c;直接调用 load3DTiles() 方法既可。 // 加载3Dtiles const load3DTiles async () > {let tiles_url "/3DTiles2/Production_1.json";let tileset await Cesium.Cesium3DTileset.fromUrl(tiles_url, {enableCollision: …

Matlab批量转换1km降水数据为tiff格式

1km降水数据处理- 制作数据裁剪掩膜 0 引言1 示例程序2 结语0 引言 本篇介绍用Matlab工具将中国1km分辨率逐月降水量数据集(1901-2024)批量转为tiff格式的过程。下面为具体内容: 1 示例程序 下载得到的nc数据(如pre_2001.nc)包含4个字段,其中降水数据的第1个维度为1-12,…

HandyJSON使用详情

注意事项:Model 需要实现 HandyJSON 协议&#xff0c;对于简单情况&#xff0c;只需声明 class/struct 并添加 HandyJSON 协议即可1.简单 JSON 结构JSON 数据:{"name": "John","age": 30,"isStudent": false }Model 类:struct Person:…

comfyUI-IPApterfaceID人脸特征提取

1.基础节点 以Checkpoint、CLIP、空Latent、K采样器、VAE解码、预览图像为基础节点。 2.人脸特征获取节点 IPAdapter FaceID节点专用于将特定人脸特征&#xff08;通过参考图提取&#xff09;融入生成图像。 参考图像&#xff0c;正面图像是想要参考人物的人像&#xff0c;最…

【React Native】Switch、Alert、Dimensions、StatusBar、Image组件

其他常用组件 swich https://reactnative.dev/docs/next/switch alert Alert React Native 如果想增加里面的按钮&#xff0c;就往这个数组里&#xff0c;按照这个格式不断的加东西就行了。但是&#xff1a; 在iOS上&#xff0c;里面多少个都有问题&#xff0c;3 个以上它…

渗透笔记1-4

一、HTTPS安全机制 1. HTTP的安全风险 窃听风险&#xff1a;明文传输导致通信内容可被直接截获&#xff08;如Wireshark抓包获取密码&#xff09;。篡改风险&#xff1a;中间人可修改传输内容&#xff08;如注入恶意脚本&#xff09;。冒充风险&#xff1a;攻击者伪造服务端身份…

《星盘接口6:星际联盟》

《星盘接口6&#xff1a;星际联盟》⚡ 第一章&#xff1a;新的黎明地球历2097年&#xff0c;陈欣和她的团队成功地将“数据之神”封印在一个独立的数据维度中&#xff0c;暂时解除了对银河系的威胁。然而&#xff0c;这场胜利并没有带来长久的和平。随着人类文明不断扩展至更遥…

【安卓笔记】进程和线程的基础知识

0. 环境&#xff1a; 电脑&#xff1a;Windows10 Android Studio: 2024.3.2 编程语言: Java Gradle version&#xff1a;8.11.1 Compile Sdk Version&#xff1a;35 Java 版本&#xff1a;Java11 1. 先熟悉JVM虚拟机的线程 ----------以下都是系统线程&#xff0c;由JV…

26-计组-多处理器

多处理器的基本概念1. 计算机体系结构分类依据&#xff1a;根据指令流和数据流的数量关系&#xff0c;计算机体系结构可分为四种类型&#xff1a;SISD、SIMD、MISD、MIMD。&#xff08;1&#xff09;SISD 单指令流单数据流定义&#xff1a;任意时刻计算机只能执行单一指令操作单…