JS中【async】和【defer】属性详解与区别

理解浏览器如何处理JavaScript以及相关的asyncdefer属性对于前端开发是非常重要的。以下是相关知识点的详细讲解:

1. 浏览器的解析和渲染过程

浏览器在加载网页时,会按照以下步骤解析和渲染内容:

  1. HTML解析: 浏览器从顶部开始逐行解析HTML文件,生成DOM树(Document Object Model),代表页面的结构。

  2. CSS解析: 同时,浏览器会解析CSS文件和内联样式,生成CSSOM(CSS Object Model),代表页面的样式。

  3. JavaScript执行: 当解析器遇到<script>标签时,默认会暂停HTML的解析和渲染,去执行脚本中的JavaScript代码。

  4. 页面渲染: 解析完所有内容并执行完所有脚本后,浏览器根据DOM树和CSSOM树渲染出页面。

2. 为什么JavaScript脚本会阻塞解析

JavaScript脚本可能会操作DOM或者改变页面内容,比如添加或删除元素、改变样式等。为了确保这些操作的正确性,浏览器在遇到<script>标签时会暂停HTML的解析。这样可以保证:

  • 顺序执行: 浏览器会严格按照脚本在HTML中的顺序来执行JavaScript代码,确保脚本间的依赖关系。

  • 页面一致性: 在脚本执行完成之前暂停解析可以防止在HTML文档解析的过程中发生不一致的情况。例如,如果脚本在解析过程中插入新元素,暂停解析可以确保这些新元素被正确处理。

3. asyncdefer属性

为了优化页面加载性能,HTML5引入了asyncdefer属性,用于控制脚本的加载和执行行为。

async 属性
  • 加载方式: 使用async属性的脚本是异步加载的,这意味着脚本会在后台加载,不会阻塞HTML文档的解析。
  • 执行时机: 一旦脚本加载完成,浏览器会立即执行它,这可能在HTML文档的解析完成之前。因此,async脚本的执行顺序无法保证,脚本之间也不应有依赖。
  • 适用场景: 适用于独立的脚本,比如广告、数据统计脚本,这些脚本不依赖于其他内容,也不改变页面结构。
<script src="script.js" async></script>
defer 属性
  • 加载方式: 使用defer属性的脚本也是异步加载的,类似于async,它们不会阻塞HTML文档的解析。
  • 执行时机: 与async不同,defer脚本会在HTML文档完全解析完毕后按顺序执行。这意味着即使脚本加载完成,它们也会等到文档解析结束才执行。
  • 适用场景: 适用于需要确保脚本顺序或依赖于整个文档的脚本。defer脚本通常用于初始化页面的JavaScript代码。
<script src="script.js" defer></script>

4. asyncdefer的区别

特性asyncdefer
加载方式异步异步
执行时机加载完成后立即执行HTML解析完成后按顺序执行
执行顺序不保证顺序保证顺序
适用场景独立脚本依赖脚本或初始化脚本

5. 使用示例

<!-- 使用async加载并执行独立的统计脚本 -->
<script src="analytics.js" async></script><!-- 使用defer加载并按顺序执行页面初始化脚本 -->
<script src="init1.js" defer></script>
<script src="init2.js" defer></script>

6. 总结

  • 浏览器在遇到<script>标签时会暂停HTML文档解析以执行JavaScript,这是为了保证文档加载和脚本执行的一致性。
  • async属性允许脚本在后台异步加载和立即执行,适用于独立、不依赖其他脚本的场景。
  • defer属性也允许脚本异步加载,但会在HTML解析完成后按顺序执行,适用于有依赖关系或初始化的场景。

使用asyncdefer可以优化页面加载性能,减少阻塞时间,提供更好的用户体验。理解它们的区别和应用场景可以帮更好地控制页面的加载行为。

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

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

相关文章

Leetcode 第 410 场周赛题解

Leetcode 第 410 场周赛题解 Leetcode 第 410 场周赛题解题目1&#xff1a;3248. 矩阵中的蛇思路代码复杂度分析 题目2&#xff1a;3249. 统计好节点的数目思路代码复杂度分析 题目3&#xff1a;3250. 单调数组对的数目 I思路代码复杂度分析 题目4&#xff1a;3251. 单调数组对…

结构型设计模式—组合模式

结构型设计模式—组合模式 欢迎长按图片加好友&#xff0c;我会第一时间和你分享持续更多的开发知识&#xff0c;面试资源&#xff0c;学习方法等等。 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你将对象组合成树形结构来表示…

网络安全服务基础Windows--第15节-CA与HTTPS理论

公钥基础设施&#xff08;Public Key Infrastructure&#xff0c;简称 PKI&#xff09;是指⼀套由硬件、软件、⼈员、策略和程序组成的系统&#xff0c;⽤于创建、管理、分发、使⽤、存储和撤销数字证书。PKI 的核⼼⽬的是通过使⽤公钥加密技术来确保电⼦通信的安全性。PKI 为数…

Linux之grep命令

在文本文件中过滤&#xff0c;包含指定字符串的行 – grep [选项] 字符串 文本文件...• 常用命令选项 – -v&#xff0c;取反匹配 – -i&#xff0c;忽略大小写 ]# grep root /etc/passwd #包含root的行 ]# grep -v root /etc/passwd #不包含root ]# grep ROOT…

数据库中的“加速器”:深度解析索引的重要性及最佳实践

文章目录 **为什么要使用索引&#xff1f;****索引的作用&#xff1a;** **索引的分类****1. 按索引字段的个数分类****2. 按照索引值的唯一性分类** **如何定义索引&#xff1f;****1. 创建索引****语句中的关键要素&#xff1a;****创建索引的示例&#xff1a;** **2. 删除索…

python 实现perfect cube完全立方数算法

perfect cube完全立方数算法介绍 完全立方数&#xff08;Perfect Cube&#xff09;是一个整数&#xff0c;它可以表示为某个整数的三次幂&#xff0c;即形如 n 3 n^3 n3的数&#xff0c;其中 n 是整数。要判断一个给定的数 x 是否是完全立方数&#xff0c;或者找出小于或等于…

【保姆级教程】使用 PyTorch 自定义卷积神经网络(CNN) 实现图像分类、训练验证、预测全流程【附数据集与源码】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发…

文本文件完整性判断-加密

一、定义 文件加密 二、实现 文件加密 import sys import hashlibdef calculate_md5(fpath: str, chunk_size: int 1024 * 1024) -> str:""" Calculates the MD5 checksum of a file located at the path specified by the fpath.Parameters----------f…

第十四节:学习Springboot 的restful接口风格(自学Spring boot 3.x的第三天)

这节记录下自己学习restful的记录。 增(PostMapping) /*** 保存学生* return*/PostMappingpublic Student save(RequestBody Student student){studentService.save(student);return student;}注意&#xff1a;传参使用RequestBody 删(DeleteMapping) /*** 删除学生信息* par…

Android Camera系列(二):TextureView+Camera

两岸猿声啼不住&#xff0c;轻舟已过万重山—李白 Android Camera系列&#xff08;一&#xff09;&#xff1a;SurfaceViewCamera Android Camera系列&#xff08;二&#xff09;&#xff1a;TextureViewCamera Android Camera系列&#xff08;三&#xff09;&#xff1a;GLS…

设计模式学习-简单的命令模式例子

上一章节介绍过了命令模式&#xff0c;这一篇文章就简单的做一个小案例来巩固学习 搭建场景 简单的搭建一个场景就行 &#xff0c;随便准备一个物体放在场景中位置Reset一下即可。 代码编写 定义接口&#xff08;或者抽象类&#xff09;ICommand 用来规范Command的行为。注意…

SpringCloud开发实战(三):集成Eureka注册中心

目录 SpringCloud开发实战&#xff08;一&#xff09;&#xff1a;搭建SpringCloud框架 SpringCloud开发实战&#xff08;二&#xff09;&#xff1a;通过RestTemplate实现远程调用 Eureka简介 Eureka 是一个基于 Java 的开源技术&#xff0c;最广为人知的是作为 Netflix 开发…

Java 输入与输出之 NIO.2【AIO】【Path、Paths、Files】【walkFileTree接口】探索之【三】

在JDK 1.7 版本中对NIO进行了完善&#xff0c;推出了NIO.2&#xff0c;也称为AIO&#xff08;异步IO&#xff09;&#xff0c;在处理大量并发请求时具有优势&#xff0c;特别是在网络编程和高并发场景下&#xff0c;表现得更为出色。 对于输出流和输入流而言&#xff0c;操作的…

【GIS开发小课堂】vue3+Cesium.js三维WebGIS项目实战(一)

随着市场对数字孪生的需求日益增多&#xff0c;对于前端从业者的能力从对框架vue、react的要求&#xff0c;逐步扩展到2D、3D空间的交互&#xff0c;为用户提供更紧密的立体交互。近年来前端对GIS的需求日益增多。 本文档详细介绍了使用Vue3和Cesium.js构建三维WebGIS项目的步骤…

024集—— 正则表达式、replace、DateTime日期的用法——C#学习笔记

DateTime 是一个struct结构体。 代码如下&#xff1a; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace ConsoleApp1 {internal class Program{static void Main(string[] args){args new s…

神策SDK不支持Windows客户端全埋点,怎么实现用户统计分析?

本文将介绍&#xff0c;ClkLog针对神策不支持全埋点的客户端实现用户访问基础统计分析 1。 客户遇到的问题 ClkLog的用户访问基础统计分析功能是基于神策SDK的全埋点来实现的。 我们遇到有些客户是使用C、C#等语言来开发的客户端&#xff0c;然而神策此类SDK&#xff08;如C, C…

psql常见报错解决

问题 解决 要在管理员模式下启动 pg_ctl start -D "D:\Program\PostgreSQL\data" 注册成服务 D:\Program\PostgreSQL\bin\pg_ctl.exe register -N "postgresql" -D "D:\Program\PostgreSQL\data" -U "postgres" -P "postgre…

守护夏日清凉:EasyCVR+AI视频智能管理方案为水上乐园安全保驾护航

随着夏季的来临&#xff0c;水上乐园成为了人们避暑消夏、亲子互动的理想去处。然而&#xff0c;随着游客量的激增&#xff0c;如何确保水上乐园的安全与秩序&#xff0c;提升游客体验&#xff0c;成为了管理者亟待解决的问题。为此&#xff0c;引入一套高效、智能的视频监控方…

workman和GateWay学习笔记

前言 workman支持Udp GateWay是基于workman的二次封装&#xff0c;更适合长链接场景 windows安装workman composer create-project workerman/webman windows运行workman cd webman php windows.php windows访问 http://ip地址:8787 将workman引入thinkphp框架理念

代码随想录算法训练营第六十二天 | 图论part11

97. 小明逛公园 #include <iostream> #include <vector> #include <climits> #include <fstream>using namespace std;void floyd(vector<vector<vector<int>>>& grid) {int n grid.size() - 1;for (int k 1; k < n; k) {…