script 脚本标签中 defer 和 async (延缓 和 异步)

2023-11-04

原文章:https://segmentfault.com/q/1010000000640869

本文章讲解几个点:

  • <script>  标签中 的 defer 和 async 是什么;
  • 使用 defer 可以解决什么问题

defer 和 async 是 <script> 标签中的属性。

当浏览器碰到 script 脚本的时候,有下面三种情况:

一、一般情况:(立即脚本、无延缓也没异步)

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

        没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该 script 标签之下的文档元素之前,也就是说不等待后续载入的文档元素,浏览器读到脚步就加载并执行。脚本执行完,再继续解析剩下的 html 未解析的部分。

二、异步:asyn

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

       有 async,加载和渲染后续文档元素的过程将和 script.js 的加载与执行并行进行(异步)。

三、延缓:defer

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

       有 defer加载后续文档元素的过程将和 script.js 的加载并行进行(异步),但是 script.js 的执行要在所有元素解析完成之后,** DOMContentLoaded 事件触发之前完成。

【PS: ** DOMContentLoaded:参见:DOMContentLoaded 事件 和 load 事件(文档加载后触发)

https://blog.csdn.net/weixin_41796631/article/details/89704728

蓝色线代表网络读取,红色线代表执行时间,这俩都是针对脚本的;绿色线代表 HTML 解析。

此图告诉我们以下几个要点:

  1. defer 和 async 在网络读取(下载)这块儿是一样的,都是异步的(相较于 HTML 解析)
  2. 它俩的差别在于脚本下载完之后何时执行,显然 defer 是最接近我们对于应用脚本加载和执行的要求的
  3. 关于 defer,此图未尽之处在于它是按照加载顺序执行脚本的,这一点要善加利用
  4. async 则是一个乱序执行的主,反正对它来说脚本的加载和执行是紧紧挨着的,所以不管你声明的顺序如何,只要它加载完了就会立刻执行
  5. 仔细想想,async 对于应用脚本的用处不大,因为它完全不考虑依赖(哪怕是最低级的顺序执行),不过它对于那些可以不依赖任何脚本或不被任何脚本依赖的脚本来说却是非常合适的,最典型的例子:Google Analytics

使用 defer 可以解决的问题:

       很多人也都遇到过这样的问题,需要直接执行别且操作DOM对象的js 总是报找不到对象的错误,原因大家也都知道就是页面还有没有加载完毕,js的操作对象还在下载中

请注意两点:

1、不要在defer型的脚本程序段中调用document.write命令,因为document.write将产生直接输出效果。
2、而且,不要在defer型脚本程序段中包括任何立即执行脚本要使用的全局变量或者函数。 

       一个常用的优化性能的方法是:当脚本不需要立即运行时,在<SCRIPT>标签中设置“defer”属性。 (立即脚本没有被包含在一个function块中,因此会在加载过程中执行。) 设置“defer”属性后,IE就不必等待该脚本装载和执行完毕。这样页面加载会更快。一般来说,这也表明立即脚本最好放在 function 块中,并在 document或者 body 对象的 onload 句柄中处理该函数。在有一些脚本需要依赖用户操作而执行时----例如点击按钮,或者移动鼠标到某个区域----使用该属性非常有用。但当有一些脚本需要在页面加载过程中或加载完成后执行,使用defer属性得到的好处就不太大。

      script中的defer属性默认情况下是false的。按照DHTML编程宝典中的描述,对于Defer属性是这样写的:
Using the attribute at design time can improve the download performance of a page because the browser does not need to parse and execute the script and can continue downloading and parsing the page instead.
      也就是说:如果是编写脚本的时候加入defer属性,那么浏览器在下载脚本的时候就不必立即对其进行处理,而是继续对页面进行下载和解析,这样会提高下载的性能。
      这样的情况有很多种。比如你定义了很多javascript变量,或者在引用文件(.inc)中写了很多的脚本需要处理,那不妨在这些脚本中加入defer属性,对性能的提高肯定有所帮助。
举例如下:

<script language="javascript" defer>
var object = new Object();
....
</script>


因为defer属性默认是为false的,那么在这里

<script language="javascript" defer>

显式声明defer属性后等同于

<script language="javascript" defer=true>
声明了defer属性之后,需要判断是否有别的变量引用了defer脚本块中的变量,否则的话会导致脚本错误的产生。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

script 脚本标签中 defer 和 async (延缓 和 异步) 的相关文章

  • 网站在 iPhone 屏幕右侧显示空白区域

    我遇到问题http eiglaw com http eiglaw com iPhone 屏幕右侧显示约 25 像素宽的空白 边框 我在 stackoverflow 上研究了这个问题 这些帖子是相关的 但是当我尝试提供的各种解决方案时 我无法
  • 将 XSL-FO 转换为 HTML

    我有一组用于 PDF 生成的 XSL FO 文档 我还需要将相同的输出数据 PDF 格式 导出为 HTML 文件 此外 我需要 HTML 具有与 PDF 类似的样式 有没有办法使用 C 将 XSL FO 转换为 XHTML NOTE 我知道
  • 导航栏下拉菜单(折叠)在 Bootstrap 5 中不起作用

    我在尝试使用以下命令创建响应式菜单或下拉按钮时遇到问题Bootstrap 5一切似乎都正常 导航图标和下拉图标出现 但它不起作用 当我单击nav图标或dropdown按钮 无dropdown menu apears 我想特别提到的是 我还包
  • 表单发布请求并存储收到的数据

    我有一个非常简单的表单 在提交时发出发布请求
  • 主页(网格)上的缩略图现在显得模糊。如何纠正?

    我不知道这看起来是否愚蠢 但从早上开始我就无法纠正这个突然出现在我的博客网站上的错误www candidopinions in http www candidopinions in 我有一个网格视图模板 其中博客文章中的特色图像作为调整大小
  • 在多个按钮中调用相同的 jQuery 函数

    我对 jQuery 不太熟悉 我下载了这段代码来创建淡入 淡出弹出表单 这是代码
  • 我可以在元标记中使用 HTML 字符实体吗?

    我有一个有两种语言的网站 英语和中文 在使用 UTF 8 字符集的英文主页中 我有 例如 这出现在搜索结果中 我想将其更改为 在哪里 20013 25991 是 中文 的 ISO 实体 搜索结果中会显示为 中文 吗 我无法将 中文 直接粘贴
  • 为什么开发者讨厌 iframe? [复制]

    这个问题在这里已经有答案了 可能的重复 iframe 被认为是 不好的做法 吗 https stackoverflow com questions 362730 are iframes considered bad practice 在与
  • 身体动画不流畅

    下面代码中的 spaceShip 在开始按住任何箭头键时移动并不顺利 它移动一步 冻结一瞬间 然后 平稳 地移动 怎样才能让它从一开始就顺利运转 而不是 冻结 My code
  • 如何为 HTML 元素创建鼠标拖动滑块?

    我发现的许多滑块插件要么仅单击以查看下一个图像 要么如果它们确实具有鼠标拖动或触摸拖动功能 则仅允许图像 有谁知道为任何 html 元素编写鼠标拖动滑块的插件或可能的方法 我专门使用 SVG 但将来如果能在 div 元素之间滑动就更好了 H
  • 如何在 PHP 的 HTML 页面中显示错误消息?

    我有以下登录表单 login php 其中要求输入用户名和密码
  • 使用 highcharts 时,为什么 Bootstrap 选项卡显示宽度不正确的选项卡窗格 div?

    因此 我正在使用 Twitter 的 Bootstrap 创建一个包含选项卡式内容的页面 但我的起始活动 div 的内容始终与其他选项卡的内容不同 例如 我在不同的选项卡中使用 highcharts js 放入图表 但活动选项卡始终显示正确
  • 如何在 select2 下拉列表中换行?

    我正在使用 select 2 下拉菜单 然后在其内容中显示一些长句子 我想在句子的正确位置添加换行符 但下拉菜单是自动调整的 For example the content of the dropdown right now looks l
  • 获取 FileReader() 的结果对象

    有什么方法可以在不通过函数的情况下获取 FileReader 的结果对象 我在下面制作了示例代码 HTML br br br div div JS var code lorem ipsum input type file change fu
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • socket.io 的良好初学者教程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • @media语法/可能的组合

    我见过其中一些 media print media screen handheld print projection media all media all and property value media screen and prope
  • 使用 css 简单地将对象居中,无需修改

    我想使用 CSS 将对象居中 而不需要任何技巧 这可能吗 如何实现 我已经尝试过了 但是我的 p 标签消失了 centered position fixed top 50 left 50 有多种方法可以使元素居中 但这取决于您的元素是什么以
  • 悬停此元素时隐藏元素后的伪元素

    我的菜单垂直放置在页面左侧和菜单之间 li 我有一个 after那是一个分隔符 我想要的是当我悬停元素本身 如果它是第一个元素 时隐藏 after 元素 或者当它是中间元素时隐藏上面和底部的元素 如果它是最后一个子元素 则隐藏 after前
  • 可以设置标题样式吗? (并且使用CSS或js?)[重复]

    这个问题在这里已经有答案了 我想知道是否可以设计一个title a href title This is a title Hello a 样式问题有两个方面 文本格式 编码 我猜这是可能的 所以在问题中这样做 工具提示样式 你能把它弄大一点

随机推荐

  • Ubuntu下配置VScode及LeetCode,开始撸代码

    Ubuntu20 04下配置VScode及LeetCode 开始撸代码 一 配置VScode环境 1 软件下载 2 软件安装及启动 3 C 基础插件的安装 4 配置软件内部Debug 5 配置内部Debug工具时的异常 正常请跳过此步 6
  • JS获取本地图片和网络图片的宽高尺寸和存储大小

    最新更新时间 2020年07月08日09 13 28 猛戳 查看我的博客地图 总有你意想不到的惊喜 本文内容 图片作为一种记录信息的载体 比文本更加生动 比视频更加精简 在日常生活中的用处很大 作为前端开发人员 操作图片的场景非常多 本文记
  • 跨域产生原因和跨域解决方案

    一 为什么会出现跨域问题 出于浏览器的同源策略限制 同源策略是一种约定 它是浏览器最核心也就是最基本的安全功能 如果缺少了同源策略 浏览器的正常功能会受到影响 可以说WEB是构建在同源策略基础之上的 浏览器只是针对同源策略的一种实现 同源策
  • 有限元方法的核心思想是什么?

    有限元方法的核心思想是什么 有限元方法似乎是在不断地简化着什么 请问有限元方法的核心思想是什么 在哪些层面对方程做了简化 每一次简化的依据和思路是什么 2 条评论 按投票排序 按时间排序 31 个回答 菲兹 睡眠厌倦患者 138 人赞同 有
  • vue3+ts+setup获取全局变量getCurrentInstance

    前言 vue3的 setup中是获取不到this的 为此官方提供了特殊的方法 让我们可以使用this 达到我们获取全局变量的目的 但是在使用typescript的时候 就会有一些新的问题产生 这里来做一个整理 vue3官方提供的方法 1 引
  • ChatGPT、New Bing、文心一言、通义千问等 AI 工具到底哪个更AI? - 第二期

    文章目录 前言 选手介绍 ChatGPT New Bing 文心一言 钉钉的文档AI 通义千问 Stable Diffusion 文心一格 前言 本次是上次文章的后续 经历了这么久的时间 我也是在几个月前拿到了通义千问的测试资格 本次参加的
  • 密码爆破漏洞详解——黑客必修入门操作( 建议收藏 )

    隔壁老张 狗剩啊 隔壁xx村的王姐家的女娃好漂亮 我想盗她qq啊 你帮我个忙呗 狗剩 我不会呀 村里大妈 那个狗剩啊 连盗个qq号都不会 他妈还好意思说他是学网络安全当黑客的 密码爆破介绍 密码爆破又叫 暴力猜解 简单来说就是将密码逐个尝试
  • 第四章:进击,拿到Web最高权限

    1 根据前关已经得到了cookie 现在需要修改cookie达到登录系统的目的 2 打开网站 以谷歌浏览器为例 F12打开控制台 找到Application 对图中3 4的值进行修改 修改的内容为你获取到的cookie的内容 3 4分别对应
  • Unity XCode 拨号和一键加群

    拨号 void CallPhone const char iphone NSString nsIphone NSString stringWithFormat tel s iphone NSLog nsIphone NSURL url NS
  • centos如何查看linux内核,版本号

    root localhost uname a Linux localhost localdomain 3 10 0 957 el7 x86 64 1 SMP Thu Nov 8 23 39 32 UTC 2018 x86 64 x86 64
  • CSDN博客的RSS订阅---使用foxmail订阅

    CSDN博客有RSS订阅 使用foxmail订阅 好处是可以第一时间邮件通知 订阅自己的博客可以作为备份 foxmail订阅方法 CSDN博客有RSS订阅 使用foxmail订阅 好处是可以第一时间邮件通知 订阅自己的博客 可以作为备份 f
  • Python爬虫教程:包图网免费付费素材爬取【附源码】

    包图网大家都知道吧 集齐海量设计素材 十分好用 可惜太贵了 今天就带大家使用Python 爬虫爬取这些素材并且保存到本地 抓取一个网站的内容 我们需要从以下几方面入手 1 如何抓取网站的下一页链接 2 目标资源是静态还是动态 视频 图片等
  • LeetCode - 回文类问题总结

    子串与子序列 1 字符子串 指的是字符串中连续的n个字符 如abcdefg中 ab cde fg等都属于它的字串 2 字符子序列 指的是字符串中不一定连续但先后顺序一致的n个字符 即可以去掉字符串中的部分字符 但不可改变其前后顺序 如abc
  • moudo网络库剖析

    muduo简介 muduo是陈硕大神在Linux平台下基于C C 开发的高性能网络库 在此基础上可以很方便的扩展 进行二次开发编写如http服务器 muduo网络库的核心框架 one thread per thread Reactor模式
  • Font Awesome 的使用

    之前一直使用的是 iconfont 阿里巴巴出品的一个字体图标库 但是最近 iconfont 不再支持 CDN 引入 只能本地下载 这样一来修改图标就非常的麻烦 于是 就找了一个类似的图标库 现在使用的比较多的一个国外字体图标库 使用方式和
  • 基于红外感应的远距离智能跟随小车,自动跟随小车

    跟随原理 下面介绍红外感应的跟随小车的自动跟随部分 基本原理 在小车上安装一个红外接收器 能测量红外入射角的感应器 人手持一个红外发射模块 根据不同的入射角 调整小车前进方向 若入射角在右边 就控制小车右转 若入射角在左边 就控制小车左转
  • QListWidget使用体验

    主窗口继承QWidget class CustomListWidgetDemo public QWidget 自定义CustomListWidget继承QListWidget class CustomListWidget public QL
  • linux sys pread64,pread()函数

    pread是一个函数 用于带偏移量地原子的从文件中读取数据 带偏移量地原子的从文件中读取数据 函数原型 ssize t pread intfd void buf size tcount off toffset 用法 返回值 成功 返回成功读
  • 新手 Java 编程思想应该如何提高?

    简化一下就是从理解抽象开始 最先要理解的就是 类 接口通常被理解为 全抽象 在Java中也有重要地位和作用 其次就是抽象类介于接口和类之间的概念 另外理解面向对象编程过程 逐渐掌握封装 继承 多态的应用从而形成一个完整的面相对象编程思想 理
  • script 脚本标签中 defer 和 async (延缓 和 异步)

    原文章 https segmentfault com q 1010000000640869 本文章讲解几个点