原文地址:HTML5′s async Script Attribute
(译者注: 异步加载,可以理解为无阻塞并发处理.)

(译者再注: 建议使用 defer,但是经测试发现 defer 属性对页面内的script无效,没有时序差别.只对外部 js文件生效 )

我对于HTML5感到兴奋不已的原因之一是它实现了众多业界期待已久的特性。我们一直需要输入框显示空白提示,但都是用JavaScript来实现的。我们也想要整个块都变成可被点击,也是使用javascript来实现。
现在WebKit为html5实现了SCRIPT标签的async异步属性。过去我们使用各种JavaScript技巧来做这种事情,但现在新的属性让防止阻塞变得相对容易。

async - HTML属性

如我前面提到的,添加async属性非常简单:

<!-- 指定async,以及 onload 回调-->
<script async src="siteScript.js" onload="myInit()"></script>  

事实上,如果你的JavaScript以及HTML结构设计的合理,那么90%的情况下你的Script元素可以使用异步加载。

defer - HTML属性

Safari 浏览器额外添加了defer属性

<!-- 指定defer,效果和async差不多-->
<script defer src="siteScript.js" onload="myInit()"></script>  

async 与 defer 的差别

正常情况下,当浏览器在解析HTML源文件时如果遇到外部的script,那么解析过程会暂停,并发送请求来下载script文件,只有script完全下载并执行后才会继续执行DOM解析。比如:

在下载过程中浏览器是被阻止做其他有用的工作的,包括 解析HTML,执行其他脚本,以及展示CSS布局。虽然Webkit预加载扫描程序可以探测性地在下载阶段进行多线程下载,但是某些页面仍然存在很大的网络延迟。
当前有很多技术来提升页面显示速度,但都需要额外的代码以及针对特定浏览器的技巧。现在,script可以通过添加async或者defer属性来让脚本不必同步执行,示例如下:

<script async src="myAsyncScript.js" onload="myInit()"></script>
<script defer src="myDeferScript.js" onload="myInit()"></script

两者的区别在于执行时的不同:
async 脚本在script文件下载完成后会立即执行,并且其执行时间一定在 window的load事件触发之前。这意味着多个async脚本很可能不会按其在页面中的出现次序顺序执行。
与此相对,浏览器确保多个 defer 脚本按其在HTML页面中的出现顺序依次执行,且执行时机为DOM解析完成后,document的DOMContentLoaded 事件触发之前。

转载于:https://www.cnblogs.com/changlon/p/7363979.html

HTML5 script元素async,defer异步加载相关推荐

  1. script标签的同步异步加载

    script标签默认是同步加载的,也就是说,当读到script标签是引入外部js文件的,会立即停止对页面的向下解析,然后下载脚本并且执行,如果说js文件相对来说比较大,而且网速什么的又不是很好,那么用 ...

  2. 14. 异步加载Js的方式有哪些?

    我们都知道渲染引擎遇到 script 标签会停下来,等到执行完脚本,继续向下渲染,如下: <script type="text/javascript" src=". ...

  3. 网页性能优化之异步加载js文件

    一个网页的有很多地方可以进行性能优化,比较常见的一种方式就是异步加载js脚本文件.在谈异步加载之前,先来看看浏览器加载js文件的原理. 浏览器加载 JavaScript 脚本,主要通过<scri ...

  4. JS异步加载及解决方式

    1.js中的同步加载和异步加载有什么不同? javascript语言是单线程机制.所谓单线程就是按次序执行,执行完一个任务再执行下一个. 对于浏览器来说,也就是无法在渲染页面的同时执行代码. 同步加载 ...

  5. JavaScript异步加载,解决js阻塞

    1.defer: 在script标签里添加defer,用于外部链接js文件,也可以异步加载内部脚本,会等待dom树生成后再执行js脚本代码 <script src="01.js&quo ...

  6. JavaScript script标签同步异步加载过程

    同步加载 同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止后续的解析,只有当当前加载完成,才能进行下一步操作. <script src="http://xxx/script.js& ...

  7. ztree配置async异步加载子节点,展开不触发请求的问题解决记录

    普通渲染方式 如果是数据量不大,普通加载,按照ztree的数据格式,直接渲染就行 //这是我自己使用的数据格式 var zNodes = [{childs: [{ directory: false, ...

  8. 【JQuery】初始化页面当异步加载时构建页面元素的顺序

    今日帮同事看JQuery页面初始化的一个问题时,由于自己没怎么了解过JQuery,所以遇到了一点小麻烦,实现的效果就是初始化页面时,默认选中页面里某表格数据集的某行数据,这种问题,在Java\Delp ...

  9. atomQQ 笔记 之 列表元素的异步加载

    在list当中,如果自定义item中的内容是从网络获取的,并且要求较高的实时性,那么就需要异步加载,这样,只需要显示在屏幕上的item以及即将被显示的item去获取网络资源,不至于对网络访问占用很大的 ...

最新文章

  1. 搭建yum源,配置yum源
  2. “纯金”卫星,撞向我们的“蛋壳时代”
  3. 使用关键字SCAN ABAP-SOURCE对ABAP源代码进行语法扫描
  4. selenium.common.exceptions.WebDriverException:no such session
  5. Module build failed: Error: Missing binding
  6. C++ 与Qt开发人机象棋(第一部分)
  7. 数组、集合和列表的区别
  8. oracle 视图的写法,Oracle视图基础详解与实例
  9. ES实现自动补全查询
  10. Markdown中如何打对勾/对号
  11. 多x多y的origin图_骏丰业主装修美图大赏!白+X的组合变形,能有多高级?
  12. 根据机器码实现软件注册
  13. 存储资源盘活助力网络强国
  14. 《AcFun 的视频架构演化实践》读后感
  15. 人工智能技术在金融风控领域中的应用
  16. SAP标准教材名称所代表的模块和含义(转)
  17. NVIDIA Cuda 7.5 on Ubuntu 14.04 64 bits
  18. 基于ADN8830 TEC控制器实现温度控制电路设计
  19. Android多线程UI更新-Handler
  20. JavaScript打印页面的出错异常与IE调用其他网页

热门文章

  1. 各种排序算法的js实现
  2. Android 软键盘按键监控
  3. 分计算iv值_机器学习-变量筛选之IV值和WOE
  4. 第十三届计算机语言学大会,第十三届全国语音学学术会议(PCC 2018) 会议通知第3号...
  5. python代码优化_Python 代码优化技巧(一)
  6. linux 代码获取当前路径,【linux】shell代码,获取当前路径,创建文件夹
  7. python socket thread_python 使用socket与thread进行实时通信
  8. angular Ng-Zrro树形控件 异步加载
  9. 以及其任何超类对此上下文都是未知的_ECCV'20 |OCRNet化解语义分割上下文信息缺失难题...
  10. 记录两段经典标定代码