js时间线及defer async

1.创建Document对象,开始解析web页面,解析HTML元素和他们的文本内容后添加Element对象和Text节点到文档中。这个阶段Document。readyState = "loading"。

 2.遇到link外部css,创建线程加载,并继续解析文档。

 3.遇到script外部js,并且没有设置async , defer ,浏览器加载,并阻塞,等待js加载完成并执行该脚本,然后继续解析文档

 4.遇到script外部js,并且设置有async,defer 浏览器创建线程加载,并继续解析文档,对于async属性的脚本,脚本加载完成后立即执行(异步禁止使用docuemnt.write())。

 5.遇到img标签等,先正常解析dom结构,然后浏览器异步加载src,并继续解析文档

 6.当文档解析完成,document.readyState = "interactive";

 7.文档解析完成后,所有设置有defer的脚本会按照顺序执行。

 8..当文档解析完成之后,document对象触发DOMContentLoaded事件,这也标志着程序执行从同步脚本执行阶段,转化为事件驱动阶段

 9.当所有saync的脚本加载完成并执行后,img等加载完成后,document.readyState = "complete" window对象触发load事件

10.从此,页面以异步响应方式处理用户输入,网络事件等。

defer  

如果script标签设置了该属性,则浏览器会异步的下载该文件并且不会影响到后续DOM的渲染;
如果有多个设置了deferscript标签存在,则会按照顺序执行所有的script
defer脚本会在文档渲染完毕后,DOMContentLoaded事件调用前执行

aysnc

async的设置,会使得script脚本异步的加载并在允许的情况下执行
async的执行,并不会按着script在页面中的顺序来执行,而是谁先加载完谁执行。

四个js文件里分别是1,2,3,4

<script>

console.log(0)

</script>

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

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

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

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

再没有做任何改变的时候输出 0 1 2 3 4

当给第三个加上defer 或者aysnc属性的时候 结果变成 0 1 2 4 3

<script>

console.log(0)

</script>

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

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

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

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

结果为0 3 2 4 1

两者都不会阻止 document 的解析

defer 会在 DOMContentLoaded 前依次执行 (可以利用这两点哦!)

async 则是下载完立即执行,不一定是在 DOMContentLoaded 前

async 因为顺序无关,所以很适合像 Google Analytics 这样的无依赖脚本

原文地址:https://www.cnblogs.com/zhanghaifeng123/p/12081583.html

时间: 2024-11-15 10:09:34

js时间线及defer async的相关文章

只存在于理想中的客户端JavaScript时间线

1.Web浏览器根据URL地址下载文档内容,并创建Document对象,解析WEB页面,HTML元素,包含的文本内容,将这些节点添加到DOM树中.在这个阶段,document.readystate属性的值是 loading. 2.当解析器遇到没有async和defer属性的<script>元素时,它把这个元素添加到DOM树中,并且开始执行其中的JavaScript脚本,这些脚本会被同步执行,并且在下载(通过src属性引用的外部js)和执行的过程中,解析器会暂停.所以在这些脚本中可以使用docu

浏览器加载时间线

浏览器加载时间线 创建document对象,添加节点对象(也就是开始搭建dom结构树),此时document.readyState = "loading" 遇到link外部css文件,创建新的线程加载,继续解析文档 遇到script引入外部js,并且如果没有设置async.defer,浏览器加载该js文件时会阻塞html的解析过程,一直等待js加载并执行完成 遇到script外部js,并且设置有async.defer,浏览器创建新线程加载,并且继续解析文档,对于async属性的脚本,脚

JSON、异步加载、时间线

JSON(其实他就是一个对象,但是和对象唯一不同的地方在与,我们常常在对象里给属性名不加双引号,但是,json必须给属性名加双引号) json是一种传输数据的格式 对象(属性名加不加双引号都行) var ob = { name:"yang", age:25; height:123 } json(属性名必须加双引号) var ob = { "name":"yang", "age":25; "height":1

[转]script之defer&amp;async

html5中script的async属性 我兴奋于html5的原因之一是一些久久未能实现的特性现在可以真正运用于实际项目中了. 如我们使用placeholder效果蛮久了但是那需要javascript来实现. 目前firefox和chrome都是实现了script标签的async属性.这个新的属性能让我们以一种更 简单的方式防止浏览器阻塞,在这之前我们需要用一些javascript小窍门来解决这个问题. async - html代码 <script async src="myscript.

node js 异步执行流程控制模块Async介绍

1.Async介绍 sync是一个流程控制工具包,提供了直接而强大的异步功能.基于Javascript为Node.js设计,同时也可以直接在浏览器中使用. Async提供了大约20个函数,包括常用的 map, reduce, filter, forEach 等,异步流程控制模式包括,串行(series),并行(parallel),瀑布(waterfall)等. 项目地址:https://github.com/caolan/async 2. Async安装 npm install async 3.

jquery中$(document).ready(function(){//todo});window.onload时间线关系

1.基于DOM的解析加载过程,即:document.readystate状态, 其有如下四个状态: a.uninitiated,未初始化状态. b.loading,dom开始解析. c.loaded,dom解析完成.document.ready触发,然后再加载其他东西(图片.延迟加载的js代码等). d.complete,所需要的图片 异步js等也加载完成,整个页面不在请求数据. 2.例子如下: document.onreadystatechange = function(){ if(docum

博客园js文件自动加defer的解决方法

问题描述 今早一看,js生成的目录一概木有了,查下了,博客园现在引用的js都加了defer 理解下async和defer的区别 先搜了下概念,以往用async比较多,defer少见 通用解决的尝试 然后使用常理的解决 ==> 无效,还是在末尾加 另类思路 得,懒得折腾,直接外联js 解决示意 原文地址:https://www.cnblogs.com/dotnetcrazy/p/12033813.html

ListView中镶嵌GridView实现时间线功能问题总汇

看了网上的时间线,基本都非常的差劲,不如自己写一个,实现的效果如下,在实现的过程中遇到了2个大的问题:1.gridView显示不全2.listview的item不可点击,那么下面写出我解决这两个问题的办法 一.GridView显示不全的问题 GridView 显示不全是因为ListView和GridView都是可以滚动的,在android中不可以在一个可以滚动的控件中镶嵌另一个可以滚动的控件,那么我们可以通过自定义GridView设置为不滚动. MyGridView import android

Threejs 官网 - 检测使用 three.js 时的 WebGL 和浏览器兼容性(Detecting WebGL and browser compatibility with three.js)

检测使用 three.js 时的 WebGL 和浏览器兼容性(Detecting WebGL and browser compatibility with three.js) 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章