利用 Page Visibility API 优化网页性能与用户体验
在现代 Web 开发中,用户可能会频繁切换标签页,或让网页处于后台运行。为了避免不必要的资源浪费并提升用户体验,合理利用 Page Visibility API 可以在页面不可见时暂停或减少资源的消耗,并在页面重新可见时恢复正常操作。
在这篇博客中,我将展示如何通过 Page Visibility API 实现以下场景:
- 当用户切换标签页时暂停视频或音频播放。
- 当页面不可见时停止资源密集型的动画。
- 页面不可见时停止 API 请求,并在页面可见时重新开始。
- 当用户返回页面时恢复定时操作。
什么是 Page Visibility API?
Page Visibility API 是一个浏览器提供的 API,它可以告诉我们页面的可见性状态。当页面变为不可见时,我们可以暂停一些不必要的操作,比如动画或媒体播放。这个 API 提供了两个核心功能:
document.hidden
:返回一个布尔值,指示页面当前是否隐藏。document.visibilityState
:返回页面的可见性状态,可以是'visible'
(页面可见)、'hidden'
(页面隐藏)或'prerender'
(页面正在预渲染)。visibilitychange
事件:当页面的可见性状态(document.visibilityState
)改变时触发。
visibilityState
的作用
document.visibilityState
提供比 document.hidden
更直观的信息。它不仅告诉你页面是否隐藏,还能进一步区分页面是否正在预渲染。例如,你可以根据不同的状态采取不同的优化措施。
浏览器兼容性
虽然 Page Visibility API 很有用,但它的兼容性在不同浏览器中略有差异。以下是各主流浏览器的支持情况:
Document.hidden
和 document.visibilityState
浏览器 | 支持情况 | 版本 |
---|---|---|
Chrome | 支持 | 自 33 版本起 |
Firefox | 支持 | 自 18 版本起 |
Safari | 支持 | 自 7 版本起 |
Edge | 支持 | 自 12 版本起 |
Opera | 支持 | 自 20 版本起 |
visibilitychange
事件
浏览器 | 支持情况 | 版本 |
---|---|---|
Chrome | 支持 | 自 62 版本起 |
Firefox | 支持 | 自 56 版本起 |
Safari | 支持 | 自 14.1 版本起 |
Edge | 支持 | 自 18 版本起 |
Opera | 支持 | 自 49 版本起 |
用户切换标签页时暂停视频播放
当用户切换标签页时,继续播放视频会浪费带宽和资源。通过 Page Visibility API,可以在页面不可见时暂停视频,等用户返回后再自动恢复播放。
const videoElement = document.querySelector("video");
document.addEventListener("visibilitychange", function() {
if (document.visibilityState === 'hidden') {
// 页面隐藏时暂停视频
videoElement.pause();
console.log("页面隐藏,视频暂停");
} else if (document.visibilityState === 'visible') {
// 页面可见时恢复视频播放
videoElement.play();
console.log("页面可见,视频继续播放");
}
});
页面不可见时停止资源密集型动画
动画可能是性能瓶颈,尤其是在页面不可见时运行动画毫无意义。通过 Page Visibility API,我们可以在页面不可见时暂停动画,减少 CPU 和 GPU 的消耗。
let animationRunning = true;
function startAnimation() {
if (!animationRunning) return;
// 假设这里有动画逻辑
console.log("动画正在运行...");
requestAnimationFrame(startAnimation);
}
document.addEventListener("visibilitychange", function() {
if (document.visibilityState === 'hidden') {
// 页面隐藏时停止动画
animationRunning = false;
console.log("页面隐藏,动画停止");
} else if (document.visibilityState === 'visible') {
// 页面可见时恢复动画
animationRunning = true;
startAnimation();
console.log("页面可见,动画恢复");
}
});
startAnimation();
页面不可见时停止 API 请求
某些情况下,持续的数据获取可能会浪费带宽。通过检测页面的可见性,可以在页面不可见时停止数据请求,优化带宽使用。
let requestInterval;
function startFetchingData() {
requestInterval = setInterval(() => {
// 模拟 API 请求
console.log("正在获取数据...");
}, 5000);
}
function stopFetchingData() {
clearInterval(requestInterval);
console.log("停止获取数据");
}
document.addEventListener("visibilitychange", function() {
if (document.visibilityState === 'hidden') {
// 页面隐藏时停止数据获取
stopFetchingData();
} else if (document.visibilityState === 'visible') {
// 页面可见时恢复数据获取
startFetchingData();
}
});
startFetchingData();
页面可见时恢复定时操作
当页面不可见时,某些定时任务可以暂停,直到用户返回页面时再恢复执行。这有助于提升资源利用效率。
let intervalId;
function startTimer() {
intervalId = setInterval(() => {
console.log("计时器正在运行...");
}, 1000);
}
function stopTimer() {
clearInterval(intervalId);
console.log("计时器停止");
}
document.addEventListener("visibilitychange", function() {
if (document.visibilityState === 'hidden') {
// 页面隐藏时停止计时器
stopTimer();
} else if (document.visibilityState === 'visible') {
// 页面可见时恢复计时器
startTimer();
}
});
startTimer();
用户返回页面时恢复音频播放
与视频类似,音频在页面不可见时继续播放不仅对用户无意义,还会浪费系统资源。通过 Page Visibility API 可以在用户返回页面时恢复音频播放。
const audioElement = document.querySelector("audio");
document.addEventListener("visibilitychange", function() {
if (document.visibilityState === 'hidden') {
// 页面隐藏时暂停音频
audioElement.pause();
console.log("页面隐藏,音频暂停");
} else if (document.visibilityState === 'visible') {
// 页面可见时恢复音频播放
audioElement.play();
console.log("页面可见,音频继续播放");
}
});
结论
Page Visibility API 是一个简单但非常有效的工具,能够让开发者根据页面的可见性来动态优化资源的使用。结合 document.visibilityState
,你可以进一步细化页面状态的控制,如在页面预渲染时暂停某些操作。
这种优化不仅提升了用户体验,还能显著减少系统资源的浪费。通过合理利用这个 API,我们可以暂停后台的视频、音频、动画、数据请求等操作,并在用户重新关注页面时迅速恢复,达到性能和体验的双重提升。
在开发过程中,别忘了考虑浏览器的兼容性问题,确保在所有平台上提供一致的用户体验。希望这篇文章能够帮助你更好地掌握 Page Visibility API 并将其应用到实际项目中。
参考内容
- 页面可见性 API - Web API | MDN (mozilla.org)
- Document:visibilitychange 事件 - Web API | MDN (mozilla.org)
- Document:hidden 属性 - Web API | MDN (mozilla.org)
- Document.visibilityState - Web API | MDN (mozilla.org)
利用 Page Visibility API 优化网页性能与用户体验的更多相关文章
- 妙趣横生的HTML5 Page Visibility API
起因 最近浏览36kr 的网页的时候偶然发现一个有趣的情况:当浏览器Tab 处于非当前页的时候,36kr 的标题栏会自动换成可爱的大白字符形象.Jeff 在第一次看到的时候就知道这种效果是通过HTML ...
- H5的Page Visibility API
概述 哈哈,又学了一个H5的API.今天突然对动态获取网页的选中状态很感兴趣,然后去查了下,发现真的有个API控制它--Page Visibility API.于是把学到的东西记录下来,供以后开发时参 ...
- Page Visibility API
在code review时看见同事使用visibilitychange 事件来监听页面的隐藏与显示,之前没有了解过这块,学习一下. document.visibilityState 主要有以下3个状态 ...
- 【学而思】利用shouldComponentUpdate钩子函数优化react性能以及引入immutable库的必要性
凡是参阅过react官方英文文档的童鞋大体上都能知道对于一个组件来说,其state的改变(调用this.setState()方法)以及从父组件接受的props发生变化时,会导致组件重渲染,正所谓&qu ...
- 【react】利用shouldComponentUpdate钩子函数优化react性能以及引入immutable库的必要性
凡是参阅过react官方英文文档的童鞋大体上都能知道对于一个组件来说,其state的改变(调用this.setState()方法)以及从父组件接受的props发生变化时,会导致组件重渲染,正所谓&qu ...
- vue-使用keep-alive优化网页性能
export default{ name: 'Home', data () { return { iconList: [], recommendList: [], swiperList: [], we ...
- 利用表达式树Expression优化反射性能
最近做了一个.Net Core环境下,基于NPOI的Excel导入导出以及Word操作的服务封装,涉及到大量反射操作,在性能优化过程中使用到了表达式树,记录一下. Excel导入是相对比较麻烦的一块, ...
- 利用图片延迟加载来优化页面性能(jQuery)
图片延迟加载也称懒加载,常用于页面很长,图片很多的页面,以电子商务网站居多,比如大家常上的京东,淘宝,页面以图居多,整个页面少说几百K,多则上兆,如果想一次性加载完成,不仅用户要哭了,服务器也得哭了. ...
- Page Visibility API(页面可见性)
页面可见性: 就是对于用户来说,页面是显示还是隐藏, 所谓显示的页面,就是我们正在看的页面:隐藏的页面,就是我们没有看的页面. 因为,我们一次可以打开好多标签页面来回切换着,始终只有一个页面在我们眼前 ...
- Page Visibility API 页面是否获取焦点 Event: visibilitychange
W3C 文档 https://www.w3.org/TR/page-visibility/ MDN 文档 https://www.w3.org/TR/page-visibility/ // Docum ...
随机推荐
- SQL 注入漏洞详解 - Union 注入
1)漏洞简介 SQL 注入简介 SQL 注入 即是指 Web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 Web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在 ...
- Telegram手机号码反查工具
Telegram手机号码反查工具 项目地址:https://github.com/bellingcat/telegram-phone-number-checker v1.2.1版本 要求python的 ...
- 【SQL】 Excel 批量编写SQL脚本
参考地址: https://zhuanlan.zhihu.com/p/134290191 有两种办法: 第一种,使用 & 拼接符号处理 ="INSERT INTO `my-info` ...
- 【Mybatis】10 实现分页 & 分页插件
回顾SQL分页查询 也就是说,在查询结果的最后控制返回的起始位置&记录数量 参数1:返回的开始位置 参数2:要返回的记录数 但是,如果说是只写了一个参数,直接表示参数2处理 LIMIT [s ...
- 【OracleDB】 07 分组查询 & 分组函数
分组函数 分组函数作用于一组数据,并对一组数据返回一个值. Oracle中分组函数的种类: - 求平均值 AVG - 计数记录数 COUNT - 求最大值 MAX - 求最小值 MIN - 求和 SU ...
- 【Win10】找不到Telnet命令
百度才发现原来我的Telnet程序就没启动... CMD终端就找不到命令... 但是有一点要注意!不能使用CMD之外的终端访问[GitBash访问无效] 打开控制面板,点卸载程序: 然后点击启动和关闭 ...
- 【转载】 5:0!AI战胜人类教官,AlphaDogfight大赛落幕
原文:https://baijiahao.baidu.com/s?id=1675621109599102721&wfr=spider&for=pc ------------------ ...
- 并行化强化学习 —— 初探 —— 并行reinforce算法的尝试 (中篇:强化学习在大规模仿真环境下单步交互并行化设计的可行性)
本篇博客是前篇博客并行化强化学习 -- 初探 -- 并行reinforce算法的尝试 (上篇:强化学习在多仿真环境下单步交互并行化设计的可行性)的继续,文中代码地址为:https://gitee.co ...
- 在vscode中通过修改launch.json文件为项目设置当前工作目录cwd——在launch.json文件中修改cwd变量
关于当前工作目录是什么以及其与模块搜索路径的区别可以参见下文: Python语言中当前工作目录(Current Working Directory, cwd)与模块搜索第一路径都是指什么??? --- ...
- pyc文件添加magic头
pyc文件添加magic头 hexedit插件安装可以去看另一篇文章:http://t.csdnimg.cn/VhqEh 我们用notepad++打开pyc文件,选择插件--->hex-edit ...