一. DOM加载过程
在浏览器地址栏输入url,DNS域名解析,找到IP,向服务器发起请求,服务器返回数据,浏览器接收二进制文件。浏览器将二进制文件转换为html,构建DOM树。
- HTML解析器
解析过程:
- 遇到link的外部css,遇到css的代码会进行css的加载;
- 遇到script标签会先去执行js的内容,直至脚本完成执行,然后继续构建DOM;
- 解析器遇到设置了async属性的script时,开始下载脚本并继续解析文档,脚本会在下载完成后尽快执行,但是解析起不会停下来等它下载,不会影响到后续DOM的渲染;
- 如果有设置了defer的script标签存在,则会按照顺序执行所有的script,defer脚本会在文档渲染完毕后,DOMContentLoaded事件调用前执行,脚本会被延迟到整个页面都解析完毕后再运行。
- CSS解析器:
每个css文件解析为样式表对象CSSStyleSheet,每个对象都包含CSSRule,CSSRule包含选择器和声明对象,以及其他与CSS语法对应的对象 - 构建render树:DOM树 + CSS树
- 布局layout与绘制paint:
计算对象之间的大小,距离确定每个节点在屏幕上的确切坐标,映射浏览器屏幕绘制,使用UI后端层绘制每个节点;
- reflow(回流):当元素属性发生改变并影响布局时(宽度,高度,内外边距等),产生回流,相当于刷新页面
- repaint(重绘):当元素属性发生改变且不影响布局(背景色,字体样式等),产生重绘不一样引起回流,回流一定引起重绘。
了解DOM加载过程可以更好地知道如何web性能优化,比如如何有效地避免reflow回流
二. history和location注意事项
1. window.history属性指向History对象,它表示当前窗口的浏览历史
- History.back() 浏览器回退
- History.forward() 浏览器前进
- History.go(val) // 可加载历史列表中的某个具体的页面(val: -1上一个页面,1前进一个页面)
- History.pushState() // 向当前浏览器会话的历史堆栈中添加一个状态
- History.replaceState() //修改当前历史记录实体
2. Location 对象window.location和document.location属性,可以拿到这个对象
- Location.href 整个URL
- Location.protocal 当前URL的协议
- Location.host 主机
- Location.hostname 主机名
- Location.port 端口号
- Location.pathname URL的路径部分,从根路径开始
- Location.search 查询字符串部分
- Location.hash 片段字符串部分,从#开始
- Location.username 域名前面的用户名
- Location.password 域名前面的密码
网友评论