JSON,异步加载,时间线

JSON是一种传输数据的格式(以对象为样板,本质上就是对象,但用途有区别,对象就是本地用的,json是用来传输的)

JSON.parse(); string ---> json

JSON.stringfiy(); json ----> string

JSON,异步加载,时间线

JSON,异步加载,时间线

浏览器绘制页面的前提工作:

JSON,异步加载,时间线

首先对html代码形成一个domTree

                   domTree

  head                                body

                               div           span       strong

                                                                 em

形成domTree的算法是深度优先算法

形成domTree的解析完毕和加载完毕是异步的,即比如有一个img标签,它先解析节点,即先挂到domTree上,然后异步加载图片

domTree形成之后等待,等待cssTree形成,cssTree和domTree都是深度优先

两个树都形成完毕之后,会拼在一起形成randerTree

domTree + cssTree = randerTree

randerTree形成之后才会绘制页面

所以应该尽量减少对HTML页面结构的改变,会重新构建domTree

reflow -----重排  dom节点的删除,添加

                          dom节点的宽高变化,位置变化,display none  ----> block

                         offsetWidth offsetHeight

repaint----重绘

---------------------------------------------------------------------------------------------------------------

异步加载js

js加载的缺点:加载工具方法没必要阻塞文档,过得js加载会影响页面效率,一旦网速不好,那么整个网站将等待js加载而不进行后续渲染等工作

有些工具方法需要按需加载,用到再加载,不用不加载

JavaScript异步加载的三种方案

1,defer 异步加载,但要等到dom文档全部解析完才会被执行。之后IE能用,也可以将代码写到内部

2,async 异步加载,加载完就执行,async只能加载外部脚本,不能把代码写在script标签里

1,2执行时也不阻塞页面

3,创建script,插入到DOM中,加载完毕后callBack

JSON,异步加载,时间线

JSON,异步加载,时间线

JSON,异步加载,时间线

但是这样会报错,原因是由于js异步加载还没加载完,就进行了执行,所以改成以下方式

JSON,异步加载,时间线

onload等待加载完毕之后就执行

JSON,异步加载,时间线

但是只能用于 Safari  chrome firefox opera,IE的script没有onload事件,只有onload没有

JSON,异步加载,时间线

所以整合一下

JSON,异步加载,时间线

但是会有问题

JSON,异步加载,时间线

这是因为loadScript函数在声明的时候,是不会去看里面的内容的,那么test就是一个未知的变量

JSON,异步加载,时间线

传递一个匿名函数引用,但是不会立即执行匿名函数引用里的内容

JSON,异步加载,时间线

js加载时间线

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

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

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

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

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

6,当文档解析完成,document.readyState = 'interactive' 。

7,文档解析完成后,所有设置有defer的脚本会按照顺序执行。(注意与async的不同,但同样禁止使用document.write())

8,document对象触发DOMContentLoaded事件,这也标志着程序执行从同步脚本阶段,转化为事件驱动阶段。

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

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

JSON,异步加载,时间线

JSON,异步加载,时间线

所以一般把js文件放在文档尾,如果要放在前面,请在文档解析后就执行