【visibilitychange】:获取当前页面可见性,深入解析,提升网页性能与用户体验的关键事件

作者:❆VE❆日期:2025/10/16

目录

第一章 前言

第二章 visibilitychange 事件简介

第三章 触发visibilitychange变更的情况

第四章 应用场景

4.1 优化资源加载

4.2 节省服务器资源

4.3 改善用户体验

第五章 实现细节

5.1 兼容性

5.2 性能优化

第六章 典例

第七章 总结


第一章 前言

在现代网页开发中,提升用户体验和优化性能是至关重要的目标。visibilitychange事件作为浏览器提供的一个强大工具,能够帮助开发者实现这些目标。小编刚好在实现一个竞价间(后续小编也会把这个竞价间的功能总结出来)的需求中遇到了,这里小编即将在本文将深入探讨visibilitychange事件的原理、应用场景以及如何在实际开发中有效利用它。

第二章 visibilitychange 事件简介

visibilitychange 是一个浏览器事件,当文档的可见性状态发生变化时触发。它主要与 Document 对象的 visibilityState 属性配合使用。visibilityState 可以取以下几种值:

  • visible:文档至少部分可见。
  • hidden:文档完全不可见。
  • prerender:文档处于预渲染状态,用户尚未与之交互。
  • unloaded:文档即将被卸载。

通过监听 visibilitychange 事件,开发者可以在文档可见性状态变化时执行相应的操作,从而优化资源使用和提升用户体验。

第三章 触发visibilitychange变更的情况

  • pc端
  1. 页面可见时,用户关闭 Tab 页或浏览器窗口。
  2. 页面可见时,用户在当前窗口前往另一个页面。
  3. 页面不可见时,用户或系统关闭浏览器窗口。
  • 移动端H5(这里说是把H5嵌入其他app的项目,使用的还是写pc端的逻辑,只是做了移动端适配!uniapp、微信小程序除外,他们有自己的生命周期钩子)
  1. 页面可见时,切到后台
  2. 页面不可见时,从后台切回展示

第四章 应用场景

4.1 优化资源加载

当用户将浏览器标签页切换到后台时,页面的可见性状态变为 hidden。此时,可以暂停一些非必要的资源加载,如视频、音频、动态效果等。例如:

1document.addEventListener('visibilitychange', () => {
2    if (document.visibilityState === 'hidden') {
3        // 暂停视频播放
4        video.pause();
5    } else if (document.visibilityState === 'visible') {
6        // 恢复视频播放
7        video.play();
8    }
9});

这种做法可以节省系统资源,减少电量消耗等等,尤其在移动设备上效果显著。

4.2 节省服务器资源

**对于一些需要频繁与服务器交互的应用,**如实时数据更新或推送通知,可以在页面不可见时减少或暂停这些操作。例如:

1let intervalId;
2document.addEventListener('visibilitychange', () => {
3    if (document.visibilityState === 'hidden') {
4        clearInterval(intervalId); // 停止轮询
5    } else if (document.visibilityState === 'visible') {
6        intervalId = setInterval(fetchData, 5000); // 每5秒更新一次数据
7    }
8});

这种做法可以减少服务器的负载,同时避免在用户未查看页面时进行不必要的数据传输。

4.3 改善用户体验

当页面从后台切换到前台时,可以利用 visibilitychange 事件重新加载或更新页面内容。例如,更新新闻文章的评论区、显示最新的消息通知等。这可以确保用户在返回页面时看到最新的内容,提升用户体验。

第五章 实现细节

5.1 兼容性

  • visibilitychange 事件在现代浏览器中得到了广泛支持,但在一些旧版本浏览器中可能不存在。因此,在使用时需要进行兼容性检查:
1if (document.hidden !== undefined) {
2    document.addEventListener('visibilitychange', () => {
3        // 处理可见性变化
4    });
5} else {
6    // 提供兼容性解决方案或降级处理
7}

5.2 性能优化

在处理 visibilitychange 事件时,需要注意避免执行过于复杂的操作,以免重新渲染时影响页面性能。例如,可以将一些耗时的操作放入 requestAnimationFrame 或 setTimeout 中,以减少对主线程的阻塞。

第六章 典例

这是小编本次需求的例子——

  • 初始化值:

  • 添加visibilitychange监听函数(最后记得销毁)
1async mounted() {
2    document.addEventListener('visibilitychange', () => {
3        this.handleVisibilityChange()
4    })
5},
  • 方法如下:
1async handleVisibilityChange() {
2    this.visibilityState = document.visibilityState
3    if (this.visibilityState === 'hidden') {
4        // 标签页隐藏时的操作
5        console.log('页面隐藏')
6        // 这里时断开websocket连接
7        closeSignWs()
8        closeBidWs()
9    } else if (
10        this.$refs.roomWrapper &&
11        this.visibilityState === 'visible'
12    ) {
13        // 当标签页可见时重新做初始话,并重连ws等操作
14        this.initInfo()
15        this.signList = []
16        this.institutionList = []
17        await this.getTimeStamp()
18        await this.getProjectInfo()
19        await this.initWebsocket()
20        // 标签页可见时的操作
21        console.log('页面可见')
22    }
23},

第七章 总结

visibilitychange 事件为开发者提供了一个强大的工具,用于优化网页性能和提升用户体验。通过合理利用这一事件,可以在页面不可见时节省资源,在页面可见时及时更新内容。在实际开发中,需要注意兼容性和性能优化,以确保最佳效果。希望本文能够帮助开发者更好地理解和使用 visibilitychange 事件,为用户提供更流畅、更高效的网页体验。


【visibilitychange】:获取当前页面可见性,深入解析,提升网页性能与用户体验的关键事件》 是转载文章,点击查看原文


相关推荐


opentype.js 使用与文字渲染
明远湖之鱼2025/10/14

笔者在某个需求实现中使用了 opentype.js 这个库,现将一些使用过程记录在本篇文章中。 opentype.js 是一个 JavaScript 库,支持浏览器和 Node.js,可以解析字体文件,拿到字体信息,并提供一些渲染方法。 虽然名字叫做 opentype.js,但除了可以解析 OpenType,也可以解析 TrueType。 支持常见的字体类型,比如 WOFF, OTF, TTF,像是 AutoCAD 的 shx 就不支持了。 需要注意的是,woff2 字体是用 Brotli 压


Redis(58)如何配置和查看Redis的慢查询日志?
Victor3562025/10/13

Redis 提供了慢查询日志功能,用于记录执行时间超过指定阈值的命令。这有助于识别和优化性能瓶颈。下面详细介绍如何配置和查看 Redis 的慢查询日志,并结合使用 Java 和 Jedis 进行示例演示。 配置慢查询日志 配置 Redis 的慢查询日志可以通过编辑 redis.conf 文件,或者在运行时使用 CONFIG SET 命令。 在 redis.conf 文件中配置 打开 redis.conf 文件,找到并设置以下参数: slowlog-log-slower-than 10000 #


走进 OpenCV 人脸识别的世界
过往入尘土2025/10/11

引言:走进 OpenCV 人脸识别的世界 在当今数字化时代,人脸识别技术作为生物特征识别领域的关键技术之一,正以前所未有的速度融入人们的生活,展现出巨大的应用潜力与价值。它通过计算机视觉技术对人脸图像或视频中的人脸特征进行提取、分析和比对,从而实现身份识别、验证等功能,广泛应用于安防监控、金融支付、门禁系统、智能交通、社交媒体等诸多领域,为人们的生活和工作带来了极大的便利与安全保障。 在安防监控领域,人脸识别技术可实时监测人员出入情况,对潜在的安全威胁进行预警。例如,在机场、火车站等交通枢纽


AI辅助制作宣传视频
Enabler_Rx2025/10/10

首先写好文字稿子,然后用google gemini模型生成音频。可以选择很多种人声,我选择了language English(US)和callirrhoe的发声,模型文生音频链接: https://cloud.google.com/text-to-speech?hl=zh-CN 然后下载音频文件 使用Microsoft Clipchamp打开音频文件,插入图像内容,可以调节音频速度,加入字幕等 然后导出生成文件 完成!


前端必看!12个JS神级简写技巧,代码效率直接飙升80%,告别加班!
刘大华2025/10/8

前言 哈喽大家好,我是大华。 在日常开发中,我们经常会遇到一些重复、冗长的代码。写起来费劲,读起来费神,维护起来更是头疼。而且代码越复杂,性能可能越受影响。 那有没有办法让代码更简洁、清晰又高效呢? JavaScript提供了许多现代语法特性,合理使用这些简写技巧,不仅能大幅减少代码量,还能提升可读性和执行效率。 很多资深前端都在用,这篇文章整理了 12 个最实用的 JS 简写技巧,并结合实际场景进行优化和补充,帮助你写出更优雅的代码。 1. 短路运算符:替代简单的 if 判断 以前我们这样写


【玩泰山派】4、制作ubuntu镜像-(5)总结制作ubuntu22.04镜像+5.10内核流程
风为你而吹2025/10/7

文章目录 前言rk镜像概念rk镜像构成生成sd卡镜像 制作根文件系统流程概述文件概述执行流程执行./mk-base-debian.sh执行mk-buster-rootfs.sh执行./mk-image.sh 总结 使用docker容器基于鲁班猫的仓库制作泰山派的ubuntu22.04根文件系统前言流程制作docker镜像启动docker容器进入容器进入容器后执行step1.准备step2.构建基础 Ubuntu 系统。step3.添加 rk overlay 层,并打包ubuntu


DrissionPage爬取汽车之家:(车名 + 颜色 + 车辆型号/续航里程)
python全栈蛇行者2025/10/5

DrissionPage爬取汽车之家 效果展示 项目概述与背景 在当今大数据时代,网络数据采集已成为获取信息的重要手段。本教程将全面详细介绍如何使用Python的DrissionPage库结合其他工具爬取汽车之家网站(https://www.autohome.com.cn/price/levelid_1)的汽车数据。汽车之家作为国内领先的汽车资讯平台,包含了丰富的汽车信息数据,这些数据对于汽车市场分析、竞品研究、价格监控等具有重要价值。 本项目旨在通过自动化技术手段,高效地采集汽


UNIX下C语言编程与实践5-C 语言编译器 cc(gcc/xlc)核心参数解析:-I、-L、-D 的使用场景与实例
迎風吹頭髮2025/10/4

一、引言:为什么需要关注 cc 编译器参数? 在 UNIX 环境下,C 语言编译器(如 gcc、xlc,统一简称 cc)是开发的核心工具。当项目规模超过单个文件、依赖第三方库或需要条件编译时,仅靠默认编译命令(如 cc main.c -o main)会频繁遇到「头文件找不到」「库链接失败」「宏定义未生效」等问题。 本文聚焦 cc 编译器中最核心的三个参数:-I(加载头文件路径)、-L(加载库文件路径)、-D(宏定义),结合实际项目案例解析其作用、使用场景及常见问题,同时拓展其他实用参数,帮助


介绍一种新的向量存储格式:DiskBBQ
Elastic 中国社区官方博客2025/10/3

作者:来自 Elastic Benjamin Trent, John Wagster 及 Ignacio Vera Sequeiros 介绍 DiskBBQ,一种 HNSW 的替代方案,并探讨何时以及为何使用它。 测试 Elastic 的领先开箱即用能力。深入我们的示例笔记本,开始免费的云试用,或立即在本地机器上尝试 Elastic。 DiskBBQ 是 Inverted Vector File (IVF) 索引的进化版。它是 Hierarchical Navigable Sm


vue2到vue3快速上手入门
cz橙2025/10/2

vue3 需要会vue2,该文档笔记基于黑马的课,进阶快速入门vue3 vue3 官方文档:https://v3.cn.vuejs.org/ main.js改变 import { createApp } from 'vue' import App from './App.vue' const app = createApp(App) app.mount('#app') /* 挂载app到id为app的元素上 */ 不需要new Vue(),直接createApp(App) App.

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0