当前位置:   article > 正文

页面加载过程_浏览器加载页面的过程

浏览器加载页面的过程

网址到页面加载完成详细流程

用户在浏览器中输入一个网址或者点击链接时,浏览器开始加载页面。页面的加载过程可以分为如下几个阶段:

  1. URL 解析:浏览器将输入的 URL 解析成协议、主机名、端口号、路径等各个部分。

  1. DNS 查询:浏览器将解析得到的主机名转换为 IP 地址,需要通过 DNS 查询来完成。

  1. 建立 TCP 连接:浏览器向服务器发送一个 TCP 连接请求,并进行三次握手来建立连接。

  1. 发送 HTTP 请求:浏览器向服务器发送 HTTP 请求,请求包括请求行、请求头、请求体等。

  1. 接收 HTTP 响应:服务器接收到请求后,会返回一个 HTTP 响应,响应包括状态行、响应头、响应体等。

  1. HTML 解析:浏览器开始解析响应内容,如果响应内容是 HTML,浏览器会将其分解成节点树。

  1. DOM 构建:浏览器根据解析得到的节点树构建出 DOM 树。

  1. CSS 解析和渲染:

  1. 解析 CSS:

浏览器通过解析 CSS 文件,生成一颗 CSSOM 树(CSS Object Model),表示样式的结构。

  1. 合并 DOM 和 CSSOM:

浏览器将 DOM 和 CSSOM 合并为一颗渲染树,表示文档的最终结构和样式。

  1. Layout(回流、也叫重排):

根据生成的渲染树,进行回流(Layout),得到节点的几何信息(在视口的位置,大小)

  1. Painting(重绘):

根据渲染树以及回流得到的几何信息,得到节点的绝对像素。

  1. Display:

将像素发送给GPU,展示在页面上。

  1. 脚本执行:如果页面中包含脚本,浏览器会执行它们。脚本可能会修改 DOM 树、触发重新渲染等操作。

  1. 图片和其他资源下载:如果页面中包含图片、样式表、脚本文件等资源,浏览器会开始下载它们。

  1. 页面完成加载:所有资源下载完成后,页面完成加载,此时浏览器会触发 onload 事件。

以上步骤并不是严格按照顺序依次执行的,它们之间可能存在重叠、并行等情况。此外,页面加载的时间还受到网络状况、页面大小、服务器性能等因素的影响,因此加载时间会有所不同。


如何生成渲染树?

  1. 从DOM树的根节点开始遍历每个可见节点。

  1. 对于每个可见的节点,找到CSSOM树中对应的规则,并应用它们。

  1. 根据每个可见节点以及其对应的样式,组合生成渲染树。

哪些是不可见节点?

  1. 一些不会渲染输出的节点,如script、link等。

  1. 一些通过css隐藏的节点

  1. script、meta 等在页面上显示不出来的节点

  1. display: none 的节点

  1. head 节点


页面的加载状态

页面的加载状态可以分为以下几种:

  1. Uninitialized(未初始化):这是文档刚被创建或已被unload()方法卸载时的状态。

  1. Loading(正在加载):文档对象已经创建,并开始加载其资源,例如图片和CSS文件等。

  1. Interactive(已交互):文档对象已经被创建,但是仍然存在一些正在加载的资源,此时用户可以看到页面的部分内容。

  1. Complete(已完成):文档对象已经被创建,所有的资源已经加载完成,此时页面已经可以完整地展示给用户。

  • 其中,第3种状态(Interactive)比较特殊,它表示文档已经被解析完成,可以进行DOM操作,但是一些图片、视频等资源还没有加载完成,此时用户可能会看到一些空白的区域或占位符,但是整个页面的框架已经构建完成。


readyStage页面属性

我们可以通过监控document.readyState属性来获取页面的加载状态。document.readyState有以下三种值:

  1. loading:正在加载页面,文档还没有解析完成。

  1. interactive:文档已经解析完成,但是还有一些资源没有加载完成。

  1. complete:页面已经全部加载完成,包括所有的资源(图片、CSS、JS等)


onload使用方法

onload 是一个事件处理函数,它会在浏览器加载页面时触发。通常情况下,我们会在页面的 body 元素上添加 onload 事件处理函数,以便在页面加载完成后执行一些操作,例如:

  1. 执行一些初始化操作:在页面加载完成后,我们可以执行一些初始化操作,例如初始化页面元素、加载第三方库等。

  1. 向服务器发送异步请求:如果页面中需要向服务器发送异步请求获取数据,我们可以将请求放在 onload 事件处理函数中,以确保请求在页面加载完成后执行。

  1. 执行一些动画效果:在页面加载完成后,我们可以执行一些动画效果,例如淡入、滑动等。

需要注意的是,onload 事件处理函数的执行时间会受到页面大小、网络状况、服务器性能等因素的影响,因此如果需要执行一些耗时操作,最好在异步操作中执行,以免阻塞页面加载。

onload 方法。

图片等资源加载完成后执行操作

如果页面中需要加载大量的图片或其他资源,我们可能需要在这些资源加载完成后执行一些操作。例如,我们可以使用以下代码,当页面中的所有图片加载完成后,在控制台输出一条消息:

  1. <body onload="console.log('All images loaded!')">
  2. <img src="image1.jpg">
  3. <img src="image2.jpg">
  4. <img src="image3.jpg">
  5. ...
  6. </body>

页面初始化操作

在页面加载完成后,我们可能需要执行一些初始化操作,例如初始化页面元素、绑定事件等。例如,我们可以使用以下代码,在页面加载完成后执行一些初始化操作:

  1. <body onload="init()">
  2. <div id="content">...</div>
  3. ...
  4. <script>
  5. function init() {
  6. var content=document.getElementById('content');
  7. content.innerHTML='Hello, world!';
  8. // 绑定事件等
  9. }
  10. </script>
  11. </body>

异步请求

在页面加载完成后,我们可能需要向服务器发送异步请求获取数据。例如,我们可以使用以下代码,在页面加载完成后向服务器发送异步请求,获取用户信息并更新页面:

  1. <body onload="loadUserInfo()">
  2. <div id="user-info">Loading...</div>
  3. ...
  4. <script>
  5. functionl oadUserInfo() {
  6. // 向服务器发送异步请求获取用户信息
  7. var xhr=newXMLHttpRequest();
  8. xhr.onreadystatechange=function() {
  9. if (xhr.readyState===4&&xhr.status===200) {
  10. var userInfo=JSON.parse(xhr.responseText);
  11. // 更新页面中的用户信息
  12. var userInfoElement=document.getElementById('user-info');
  13. userInfoElement.innerHTML=userInfo.name+' ('+userInfo.email+')';
  14. }
  15. };
  16. xhr.open('GET', '/api/user', true);
  17. xhr.send();
  18. }
  19. </script>
  20. </body>

window.onload

window.onload 和前面提到的 onload 事件是一样的,都是在页面加载完成后触发。不同的是,window.onload 是通过 JavaScript 代码来注册事件处理程序,而不是通过 HTML 元素的 onload 属性来注册。具体来说,我们可以使用以下代码来注册 window.onload 事件处理程序:

  1. window.onload=function() {
  2. // 页面加载完成后执行的操作
  3. };

这里的 window 对象表示全局对象,在浏览器环境中等价于 window 关键字。我们可以将上述代码放在 <script> 标签中,或者放在外部 JavaScript 文件中,并在页面中引入这个文件,来实现在页面加载完成后执行一些操作的效果。例如:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Page Title</title>
  5. <scriptsrc="script.js"></script>
  6. </head>
  7. <body>
  8. <h1>Hello, world!</h1>
  9. </body>
  10. </html>
  11. window.onload = function() {
  12. console.log('Page loaded!');
  13. };

在上述示例中,当页面加载完成后,会在控制台输出一条消息 "Page loaded!"。由于 JavaScript 代码是在页面加载完成后执行的,因此 window.onload 事件处理程序也会在页面加载完成后执行。

常见方法举例

1、readystatechange 事件:

readystatechange 事件:这个事件在页面的状态变化时触发,包括 loadinginteractivecomplete 等状态。我们可以使用 document.readyState 属性来获取当前页面的加载状态,然后在 readystatechange 事件中根据需要执行一些操作。通常情况下,我们会在 readystatechange 事件中判断 document.readyState 是否为 complete,如果是则表示页面已经加载完成。

  1. document.onreadystatechange=function() {
  2. console.log(document.readyState);
  3. if (document.readyState==="complete") {
  4. // 页面加载完成
  5. }
  6. }
2、pageshow 事件:

pageshow 事件:这个事件在页面被加载时触发,并且在每次显示页面时也会触发。例如,当用户从浏览器的历史记录中返回到当前页面时,会触发 pageshow 事件。这个事件和 onload 事件有些相似,但是 pageshow 事件可以在页面刷新和后退/前进操作时触发。

onpageshow 事件在用户浏览网页时触发。onpageshow 事件类似于 onload 事件,onload 事件在页面第一次加载时触发, onpageshow 事件在每次加载页面时触发,即 onload 事件在页面从浏览器缓存中读取时不触发。

  1. window.addEventListener("pageshow", function(event) {
  2. if (event.persisted) {
  3. // 从浏览器缓存中恢复页面时触发
  4. } else {
  5. // 从新加载页面时触发
  6. }
  7. });
3、beforeunload 事件:

beforeunload 事件:这个事件在页面即将卸载时触发,通常用于提示用户保存修改或确认是否要离开当前页面。在 beforeunload 事件中,我们可以使用 event.returnValue 属性来设置提示消息

  1. window.addEventListener('beforeunload', function(event) {
  2. event.preventDefault();
  3. event.returnValue='确定要离开当前页面吗?';
  4. });
4、DOMContentLoaded 事件:

DOMContentLoaded 事件:这个事件在文档的 DOM 树构建完成后触发,即在页面的 HTML 和 JavaScript 文件都被下载完成并解析完毕后触发。与 onload 事件不同的是,DOMContentLoaded 事件

不需要等到所有外部资源(如图片、样式表、脚本等)都加载完成才触发

这个事件通常用于在页面加载完成后执行一些初始化操作,例如操作 DOM 元素、绑定事件等。

  1. document.addEventListener('DOMContentLoaded', function() {
  2. // DOM 树构建完成后执行的代码
  3. });
5、onload 事件:

onload 事件:这个事件在页面及其所有外部资源都加载完成后触发。在 onload 事件中,我们可以执行一些需要等待页面加载完成后才能执行的操作,例如操作 DOM 元素、发送 AJAX 请求等。一般来说,我们可以使用 window.onload 或者 addEventListener('load', handler) 来注册 onload 事件处理程序。

  1. window.onload=function() {
  2. // 页面及其所有外部资源都加载完成后执行的代码
  3. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/940028
推荐阅读
相关标签
  

闽ICP备14008679号