这一次,不再为web页面生命周期烦恼

简介: 这一次,不再为web页面生命周期烦恼

这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战

什么是Web页面生命周期?

我们每天在浏览器中通过一个又一个的标签页来浏览相关的信息,当我们在浏览器打开很多个标签页的时候,浏览器在资源紧张的时候,并不会为每一个网页保存资源,浏览器会在标签页不活动的时候,重新分配资源。浏览器对这些页面的干预会通过页面生命周期API暴露出来。这个生命周期就是本次我们讨论的主要话题。

页面生命周期的主要事件

1. DOMContentLoaded

该API表示浏览器已经完全加载了HTML,并构建好了DOM树,但是css和img等外部资源尚未加载完成。注意:这里的外部资源指的是需要发送http请求获得的资源,而不是自己文件中的资源,我们看下面的例子,下面的这个例子中的img是来自cdn的资源,而不是本地资源,如果是请求的本地资源是能够获取到图片的尺寸的。

<h1>Hello, DOMContentLoaded!</h1>
<img id="img" src="https://en.js.cx/clipart/train.gif?speed=1&cache=0">
<script>
    function testReady() {
        alert('DOM树已经构建完毕!')
        alert(`此时图片的大小为${img.offsetWidth}*${img.offsetHeight}`)
    }
    document.addEventListener('DOMContentLoaded',testReady);
</script>
复制代码

CodeSandBox在线演示

  • DOMContentLoaded会等待所有script标签执行完毕之后再执行。
<script>
    document.addEventListener("DOMContentLoaded", () => {
        alert("DOM ready!");
    });
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.3.0/lodash.js"></script>
<script>
    alert("Library loaded, inline script executed");
</script>
复制代码

上面的代码会先输出 Library...,然后才输出DOM ready!

  • 如果一个样式资源后面跟着一个script标签,必须执行完样式和这个script标签才会调用DOMContentLoaded。
<script>
    document.addEventListener("DOMContentLoaded", () => {
        alert("DOM ready!");
    });
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.3.0/lodash.js"></script>
<script>
    alert("Library loaded, inline script executed");
</script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.0.2/css/bootstrap-grid.css" rel="stylesheet">
<script>
  // 在样式表加载完成之前,脚本都不会执行
  alert(getComputedStyle(document.body).marginTop);
</script>
复制代码

2. window.onload

这个事件表示,页面已经加载完了所有的HTML、DOM树和样式图片等资源。

<script>
    window.onload = function test() {
        alert('HTML、图片、样式等资源均加载完毕');
        alert(`图片的大小是${img.offsetWidth}*${img.offsetHeight}`);
    }
</script>
<img id="img" src="https://en.js.cx/clipart/train.gif?speed=1&cache=0">
复制代码

CodeSandBox在线演示

3. window.unload

这个事件在访问者离开页面的时候触发,在这里可以做一些不涉及延迟操作的事。

let analyticsData = { /* 带有收集的数据的对象 */ };
window.addEventListener("unload", function() {
  navigator.sendBeacon("/analytics", JSON.stringify(analyticsData));
});
复制代码

4. window.beforeunload

这个事件会在叶面即将关闭或者跳转的时候提醒用户是否确认。

<h1>Hello, DOMContentLoaded!</h1>
<a href="http://www.baidu.com">点击跳转到百度</a>
<script>
    window.addEventListener('beforeunload', (event) => {
        // Cancel the event as stated by the standard.
        event.preventDefault();
        // Chrome requires returnValue to be set.
        event.returnValue = 'Write something clever here..';
    });
</script>
复制代码

CodeSandBox在线演示

判断文档是否加载完毕:readyState

该API共包含以下三个状态。

1. loading(文档正在加载)

2. interactive(可交互,但是一些图片资源和样式仍在加载中)

3. complete(文档全部加载完成)

console.log('初始化状态是:',document.readyState);
img.onload = () => console.log('图片被加载完毕');
document.addEventListener('DOMContentLoaded',() => console.log('DOMContentLoaded'))
document.addEventListener('readystatechange',() => console.log('状态变为:',document.readyState))
window.onload = () => console.log('window onload');
复制代码

CodeSandBox在线演示

参考资料

相关文章
|
4天前
|
消息中间件 监控
RabbitMQ的Web管理页面
RabbitMQ的Web管理页面
26 0
|
4天前
|
自然语言处理 Java 数据库连接
掌握JSP页面编程:动态生成Web内容
【4月更文挑战第3天】Java Server Pages (JSP) 是一种用于创建动态Web内容的Java技术,它结合HTML并允许在页面中嵌入Java代码。JSP支持代码片段、表达式语言(EL)和JSTL标签库,简化动态内容生成。当服务器接收到请求时,执行JSP中的Java代码并将结果嵌入HTML返回给客户端。示例展示了如何显示当前日期和时间。JSP可与Servlet、JavaBeans、数据库等结合,用于构建功能丰富的交互式Web应用。
掌握JSP页面编程:动态生成Web内容
|
4天前
|
编解码 前端开发 Java
大华相机接入web页面实现人脸识别
大华相机接入web页面实现人脸识别
21 0
|
4天前
|
机器学习/深度学习 人工智能 前端开发
机器学习PAI常见问题之web ui 项目启动后页面打不开如何解决
PAI(平台为智能,Platform for Artificial Intelligence)是阿里云提供的一个全面的人工智能开发平台,旨在为开发者提供机器学习、深度学习等人工智能技术的模型训练、优化和部署服务。以下是PAI平台使用中的一些常见问题及其答案汇总,帮助用户解决在使用过程中遇到的问题。
|
3天前
|
Android开发
Android WindowFeature小探究,Android客户端Web页面通用性能优化实践
Android WindowFeature小探究,Android客户端Web页面通用性能优化实践
|
2天前
|
JavaScript Java 测试技术
《手把手教你》系列技巧篇(四十六)-java+ selenium自动化测试-web页面定位toast-下篇(详解教程)
【5月更文挑战第10天】本文介绍了使用Java和Selenium进行Web自动化测试的实践,以安居客网站为例。最后,提到了在浏览器开发者工具中调试和观察页面元素的方法。
12 2
|
3天前
|
Web App开发 JavaScript 测试技术
《手把手教你》系列技巧篇(四十五)-java+ selenium自动化测试-web页面定位toast-上篇(详解教程)
【5月更文挑战第9天】本文介绍了在Appium中处理App自动化测试中遇到的Toast元素定位的方法。Toast在Web UI测试中也常见,通常作为轻量级反馈短暂显示。文章提供了两种定位Toast元素的技巧.
10 0
|
4天前
|
存储 人工智能 测试技术
python自动化测试实战 —— CSDN的Web页面自动化测试
python自动化测试实战 —— CSDN的Web页面自动化测试
194 0
|
4天前
|
机器学习/深度学习 前端开发 数据可视化
数据分析web可视化神器---streamlit框架,无需懂前端也能搭建出精美的web网站页面
数据分析web可视化神器---streamlit框架,无需懂前端也能搭建出精美的web网站页面
|
4天前
|
开发框架 安全 搜索推荐
如何使用Python Flask发布web页面至公网并实现远程访问【内网穿透】
如何使用Python Flask发布web页面至公网并实现远程访问【内网穿透】