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:在后台加载脚本,文档解析不中断,等脚本加载完成则停止文档的解析,先执行脚本完成,再继续解析文档
js延迟加载、js异步加载的更多相关文章
- 如何使用 require.js ,实现js文件的异步加载,避免网页失去响应,管理模块之间的依赖性,便于代码的编写和维护。
一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载.下面的网页代 ...
- 延迟加载、异步加载js
defer为true:延迟加载脚本,在文档完成解析完成开始执行,并且在DOMContentLoaded事件之前执行完成. async(HTML5新增的属性)为true:异步加载脚本,下载完毕后再执行, ...
- iScroll.js 向上滑动异步加载数据回弹问题
iScroll是一款用于移动设备web开发的一款插件.像缩放.下拉刷新.滑动切换等移动应用上常见的一些效果都可以轻松实现. 现在最新版本是5.X,官网这里:http://iscrolljs.com/ ...
- js回调与异步加载的用法
以前还是菜鸟的时候(虽然现在依然很菜 -_-|| )对异步加载与回调函数的技术无比向往,但也一直没有使用过,这次因为页面逻辑太过复杂,一堆请求逻辑,如果还是用顺序请求,页面的速度... 领导又要挠头了 ...
- 新手教程:不写JS,在MIP页中实现异步加载数据
从需求谈起:在 MIP 页中异步加载数据 MIP(移动网页加速器) 的 加速原理 除了靠谱的 MIP-Cache CDN 加速外,最值得一提的就是组件系统.所有 JS 交互都需要使用 MIP 组件实现 ...
- Vue.js 子组件的异步加载及其生命周期控制
前端开发社区的繁荣,造就了很多优秀的基于 MVVM 设计模式的框架,而组件化开发思想也越来越深入人心.这其中不得不提到 Vue.js 这个专注于 VM 层的框架. 本文主要对 Vue.js 组件化开发 ...
- js文件 与 css文件 异步加载
使用lazyload 异步加载css js 文件. 提升页面初始化的速度,减少卡顿时间 , 下面是 使用方法 与 lazyload.js 源码 (中文注释) 调用方法后. 会追加到 head 标签末尾 ...
- require.js模块化管理和加载js(按需加载)简单实例教学
一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载.下面的网页代 ...
- Javascript 异步加载详解(转)
本文总结一下浏览器在 javascript 的加载方式. 关键词:异步加载(async loading),延迟加载(lazy loading),延迟执行(lazy execution),async 属 ...
- Javascript 异步加载详解
Javascript 异步加载详解 本文总结一下浏览器在 javascript 的加载方式. 关键词:异步加载(async loading),延迟加载(lazy loading),延迟执行(lazy ...
随机推荐
- openstack 下云主机所在目录
1.先查看云主机运行在哪个节点 2. [root@compute01 ~]# cd /var/lib/nova/instances/ 注: 云主机是一台链接克隆的虚拟机,_base 是母盘, fa56 ...
- Java数组之什么是数组?+ 数组的声明和创建
数组 数组是相同类型数据的有序集合. 数组描述的是相同类型的若干个数据,按照一定的先后次序排序组合而成. 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们. 数组声明创建 首先 ...
- ORACLE监听无法启动的几个原因
1./etc/hosts中配置问题 误删了127.0.0.1的默认记录 2./var/tmp/.oracle的权限问题 TNS-12546:TNS:permission denied TNS-1256 ...
- Kubernetes--Ingress资源类型
Ingress资源类型 基于HTTP暴露的每个Service资源均可发布于一个独立的FQDN主机名之上,如 " www.ik8s.io " :也可发布于某主机上的URL路径之上,从 ...
- 博弈论[leetocde913]
class Solution { static final int MOUSE_WIN = 1; static final int CAT_WIN = 2; static final int DRAW ...
- 模态框拖拽案例分析--元素偏移量 offset 系列
弹出框,我们也称为模态框. 模态框拖拽案例分析: (1)点击弹出层, 会弹出模态框, 并且显示灰色半透明的遮挡层. (2)点击关闭按钮,可以关闭模态框,并且同时关闭灰色半透明遮挡层. (3)鼠标放到模 ...
- Mardown学习
Mardown学习 标题: 一级标题:'#'+'空格'+'标题名字'+'回车' 二级标题:'##'+'空格'+'标题名字'+'回车' 三级标题:'###'+'空格'+'标题名字'+'回车' 四级标题: ...
- 【Appium_python】多进程启动时,没有设置间隔导致连接关闭,以及等待时间,导致用例未执行完成,服务提早关闭。
多进程启动多设备时,没有设置间隔时间,appium服务器以为受到远程攻击,就自动关闭连接,导致服务启动失败, 解决方法:用time.sleep设置时间间隔 也需要增加等待时间,等待其他设备用例都执行完 ...
- 运行不出来真的QAQ
学C的时候最大的苦恼是编译不通过和运行不正确 学了C++之后就开始有编译过了但运行不出来的情况了TAT
- win 端口占用
netstat -aon|findstr "8080" 查看端口 TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 11468 TCP 172.27.232 ...