你知道document的四个生命周期区别吗?


前言

提示:我们通过对一个新页面的打开来探究页面的生命周期:


一、window.open语法?

open()
open(url)
open(url, target)
open(url, target, windowFeatures)
//target : _self、_blank、_parent 和 _top。
//windowFeatures :  限制窗口的属性:
// windowFeatures :  "left=100,top=100,width=320,height=320";

对新建的窗口添加回调

	
   let newWindow = window.open(window.location.origin, '_blank') as any;
    console.log(newWindow);
    newWindow.onload = function() {
       console.log("加载完成");
       newWindow.alert('callback');
    }
  }

二、document.write()

注意点:

  1. document.write() 方法将文本字符串写入由 document.open() 打开的文档流。
  2. document.write(exp1,exp2,exp3,....), 多参数会自动换行
  3. 多次调用会连续写入
<html lang="zh-CN">
  <head>
    <title>编写示例</title>

    <script>
      window.onload = newContent;
      function newContent() {
        document.write("<h1>旧的不去,新的不来!</h1>");
        document.open()
        document.write("<h1>主标题1</h1>");
        document.write("<h1>主标题123</h1>");
        document.close()
      }

    </script>
  </head>

  <body>
    <p>一些原始文档内容。</p>
  </body>
</html>

没有新开流

在这里插入图片描述

新开流

在这里插入图片描述

三、页面加载四大生命钩子

HTML 页面的生命周期包含四个重要事件:

  • DOMContentLoaded 事件 —— DOM 已经就绪,因此处理程序可以查找 DOM 节点,并初始化接口。
  • load 事件 —— 外部资源已加载完成,样式已被应用,图片大小也已知了。
  • beforeunload 事件 —— 用户正在离开:我们可以检查用户是否保存了更改,并询问他是否真的要离开。
  • unload 事件 —— 用户几乎已经离开了,但是我们仍然可以启动一些操作,例如发送统计数据。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>生命周期钩子示例</title>
</head>
<body>
    <h1>生命周期钩子示例</h1>
      <a href="baidu.com">离开当前网页跳去百度</a>
	  <br/>
	  <br/>
	  <br/>
    <img style ="width:400px" src="https://th.bing.com/th/id/R.8d52fd88fbacb0bc34afa0d3e3d3fbf0?rik=YLBGQ2YxYJczDg&riu=http%3a%2f%2fwww.08lr.cn%2fuploads%2fallimg%2f220330%2f1-2300134436.jpg&ehk=h6QkPS87X6L6Vb7h5F10YmPZlLWLGKOMcKNcY9zMLRA%3d&risl=&pid=ImgRaw&r=0" />
    <p>页面加载中,请稍候...</p>

    <script>
        // DOMContentLoaded 事件
        document.addEventListener('DOMContentLoaded', function() {
            console.log('DOM 已就绪,可以查找节点和初始化接口。');

            let img = document.getElementsByTagName('img')[0]
            console.log('获取img高度',img.width , img.height)  // 能获取到节点,但是获取不到高度,因为还没加载完
            document.querySelector('p').textContent = 'DOM 已加载完成。';
        });

        // load 事件
        window.addEventListener('load', function() {
            console.log('所有外部资源已加载完成,样式已应用。');
            // 例如,我们可以在这里执行一些需要等待图片加载完成后的操作
            // let img = document.getElementsByTagName('img')[0]
            // console.log(img.width , img.height) // 能获取到高度
            document.querySelector('p').textContent += '所有资源加载完成。';
        });

        // beforeunload 事件
        window.addEventListener('beforeunload', function(event) {
            // 检查用户是否保存了更改
            var isFormDirty = true; // 假设表单未保存
            if (isFormDirty) {
                event.preventDefault();
                event.returnValue = '你确定要离开吗?你还有未保存的更改!';
            }
            console.log('用户即将离开页面。');
        });

        // unload 事件
        window.addEventListener('unload', function() {
            console.log('用户正在离开页面,执行一些清理操作。');
            // 例如,我们可以在这里发送一些统计数据
            // 注意:在某些浏览器中,unload事件可能不允许异步操作
        });
    </script>
</body>
</html>
在 Vue 2 中,整个项目的生命周期由多个阶段组成,主要包括: - **Vue 实例的生命周期(组件级)** - **页面的生命周期(Vue 根实例)** - **浏览器环境的生命周期(页面加载、刷新、关闭)** 下面我将从**Vue 实例初始化到页面销毁**的全过程,详细说明 Vue 2 项目的生命周期。 --- ## ✅ 一、Vue 实例生命周期(组件级) Vue 组件的生命周期分为 8 个阶段,适用于所有组件,包括根组件和子组件。 ### 1. 生命周期钩子函数(按执行顺序) | 阶段 | 钩子函数 | 描述 | |------|----------|------| | 创建前 | `beforeCreate` | 实例刚被创建,数据观测和事件还未初始化 | | 创建后 | `created` | 实例已完成数据观测、属性和方法的运算,但 DOM 还未挂载 | | 挂载前 | `beforeMount` | 模板编译/渲染之前,此时 DOM 还未生成 | | 挂载后 | `mounted` | 模板已渲染完成,真实 DOM 已挂载,适合进行 DOM 操作、调用接口 | | 更新前 | `beforeUpdate` | 响应式数据更新时触发,但 DOM 还未更新 | | 更新后 | `updated` | DOM 已更新,适合进行更新后的 DOM 操作 | | 销毁前 | `beforeDestroy`(Vue 2) | 组件销毁前调用,可执行清理操作(如定时器、事件监听器) | | 销毁后 | `destroyed` | 组件已销毁,所有绑定和子组件实例都被移除 | ### 2. 示例代码 ```javascript export default { beforeCreate() { console.log('beforeCreate: 实例创建前') }, created() { console.log('created: 实例已创建') }, beforeMount() { console.log('beforeMount: 挂载前') }, mounted() { console.log('mounted: 挂载完成') }, beforeUpdate() { console.log('beforeUpdate: 数据更新前') }, updated() { console.log('updated: 数据更新完成') }, beforeDestroy() { console.log('beforeDestroy: 销毁前') }, destroyed() { console.log('destroyed: 销毁完成') } } ``` --- ## ✅ 二、Vue 项目整体生命周期(根组件) Vue 项目的根组件(通常是 `main.js` 中创建的 Vue 实例)也会经历上述生命周期钩子。 ```js // main.js new Vue({ store, router, render: h => h(App) }).$mount('#app') ``` - `beforeCreate` 和 `created` 会在 `main.js` 执行时运行。 - `mounted` 会在 `#app` 被挂载后执行。 - 当用户离开页面或调用 `$destroy()` 时,`beforeDestroy` 和 `destroyed` 会执行。 --- ## ✅ 三、浏览器页面生命周期(全局) 除了 Vue 实例的生命周期外,浏览器层面也有一些全局生命周期事件: ### 1. 页面加载 - `DOMContentLoaded`:HTML 文档加载并解析完成 - `load`:整个页面(包括图片、脚本等资源)加载完成 ```js window.addEventListener('DOMContentLoaded', () => { console.log('DOM 已加载') }) window.addEventListener('load', () => { console.log('页面资源已全部加载完成') }) ``` ### 2. 页面卸载 - `beforeunload`:用户即将离开页面时触发(可用于提示用户保存数据) ```js window.addEventListener('beforeunload', (e) => { e.preventDefault() e.returnValue = '确定要离开吗?' // 有些浏览器会忽略此值 }) ``` ### 3. 页面隐藏/显示(移动端) - `visibilitychange`:页面是否在前台/后台切换 ```js document.addEventListener('visibilitychange', () => { if (document.visibilityState === 'hidden') { console.log('页面被隐藏') } else { console.log('页面回到前台') } }) ``` --- ## ✅ 四、项目启动全过程总结 1. **页面加载开始** - 浏览器加载 HTML - 加载并执行 JS(包括 Vue 和项目代码) 2. **Vue 实例初始化** - `beforeCreate` → `created` 3. **挂载开始** - `beforeMount` → `mounted` 4. **用户交互** - 数据变更触发 `beforeUpdate` → `updated` 5. **页面销毁** - 路由跳转或手动调用 `$destroy()` 触发 `beforeDestroy` → `destroyed` 6. **页面关闭** - 用户关闭页面或刷新,触发 `beforeunload` --- ## ✅ 总结 | 阶段 | Vue 生命周期 | 浏览器事件 | |------|--------------|------------| | 初始化 | `beforeCreate`, `created` | `DOMContentLoaded` | | 挂载 | `beforeMount`, `mounted` | `load` | | 更新 | `beforeUpdate`, `updated` | - | | 销毁 | `beforeDestroy`, `destroyed` | `beforeunload` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子羽bro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值