js延迟加载、js异步加载
1.js延迟加载
(1)js延迟加载是js性能优化的一种方式
(2)作用:为了提高网页的加载速度
(3)原理:等网页加载完成之后再加载js文件
··需要优化的原因:HTML元素是按照其在页面中出现的次序调用的,如果需要使用JavaScript来操作DOM元素,
比如:获取DOM对象;修改DOM元素的结构
结果JavaScript加载在其需要操作的DOM元素之前,则会引起代码出错,原因是HTML结构没有加载完成,需要操作的DOM元素无法获取,得到的是空对象
(4)js延迟加载有6种方式:
1.defer属性(只支持IE,不建议使用)
2.async属性
··H5为<script>标签新添的属性,执行的原理是异步加载
··存在的问题:无法控制脚本的执行顺序;在load事件前执行;可能在DOMContentLoader事件触发前/后执行
··应用场景:当前页面的脚本之间彼此独立,且不依赖当前页面的其他脚本
3.动态创建DOM方法
4.使用jQuery的getScript方法、
··getScript()是通过HTTP GET请求 载入并执行js文件
··getScript(url,success(response,status))
·url:请求地址
·success:成功的回调函数;response:请求的数据结果;status:返回的状态码
5.setTimeout方法
6.让js文件最后加载
2.js异步加载、js同步加载
(1)js异步加载
··非阻塞加载,在浏览器下载并执行js文件的同时,继续对后续页面的处理
(2)js同步加载
··阻塞加载,直接将<script>放进<head>里,同步加载是安全的
··阻塞加载会阻止浏览器继续解析,直到当前的加载完成,为了优化页面阻塞,最常用的方法是将<script>放到body的结束标签前
3.DOMContentLoaded 和 load 的区别
(1)当HTML文档解析完成就会触发DOMContentLoaded,而当所有资源解析完成才会触发load事件
··存在defer / async 的情况:
·存在defer的情况:等DOM构建完成后执行脚本,而JavaScript脚本需要等待CSSOM解析完成才执行,
所以等DOM、CSSOM、脚本执行完成,DOMContentLoaded才会被触发
·存在async的情况:等HTML文档解析完,DOMContentLoaded就会被触发,不需要等脚本、CSSOM加载等等
(2)如何衡量一个网页的加载速度?
··当网页从空白到出现内容的时间,这个时间就是HTML文档加载、解析后,DOMContentLoaded事件被触发的过程
4.浏览器渲染的原理
(1)浏览器向服务器请求到了HTML文档,然后开始解析,生成DOM(文档对象模型),到这里为止,HTML文档被加载、解析完成,
如果有css则生成CSSOM(css对象模型),然后DOM和CSSOM生成渲染树,有了渲染树就知道了所有节点的样式,
然后根据节点和样式计算它们在浏览器的大小和位置,然后就是绘制到浏览器
(2)其中存在一个问题:JavaScript可以阻塞DOM的生成
··如果在HTML中插入一个脚本,浏览器是默认先执行脚本再继续往下解析HTML,而JavaScript是可以查询任意对象的样式,
所以需要CSSOM生成才可以执行JavaScript
··其中存在同步脚本和异步脚本的区别:
·同步脚本:停止解析,先执行脚本再继续往下解析
·异步脚本:H5中<script>定义了defer 和 async 属性
defer:在后台加载脚本,文档解析不中断,等文档解析完成再执行脚本;defer的执行顺序与编写位置有关
async:在后台加载脚本,文档解析不中断,等脚本加载完成则停止文档的解析,先执行脚本完成,再继续解析文档
最新文章
- Android stdio Apktool源码编译
- 真核转录组(denovo/resequencing)及案例分析
- hdu 4223
- JSON 之 SuperObject(3): 访问
- VMware系统运维(七)vCenter Inventory Server安装
- MySQL 的 read_buffer_size 参数是如何影响写缓冲和写性能的?
- 【老鸟学算法】包含 min函数的栈设计——java实现
- Wix学习整理(7)——在开始菜单中为HelloWorld添加卸载快捷方式
- Ceph编译安装教程
- 2017-2018-1 1623 bug终结者 冲刺003
- SpringIOC学习二
- 【RevolC FaeLoN Uva 10972】
- 展开被 SpringBoot 玩的日子 《 二 》 WEB 开发
- Linux samba多用户挂载
- 步步为营-42-通过DataAdapter实现增删查改
- jquery 元素选择器
- singleInstance和singleTask导致startActivityForResult回调失败
- 函数对象与仿函数(function object and functor)
- 修复IE7浮动元素自动换行的bug
- 20165207 实验一 Java开发环境的熟悉