page visibility api用于检测页面可见性状态以优化资源消耗和用户体验,通过document.visibilitystate获取visible/hidden/prerender/unloaded状态,监听visibilitychange事件实现轮播暂停、视频控制、埋点节流等优化。

页面可见性 API(Page Visibility API)能让你知道用户当前是否正在查看页面,比如切换标签页、最小化窗口或锁屏时,页面就不可见了。这不只是“页面是否在前台”的简单判断,而是帮你精准控制资源消耗、优化用户体验的关键能力。
监听页面可见性变化
通过 document.visibilityState 可以获取当前状态:visible(页面可见)、hidden(页面不可见)、prerender(预渲染中,较少见)、unloaded(页面即将卸载)。更常用的是监听 visibilitychange 事件:
- 在
DOMContentLoaded后绑定事件,避免错过初始状态 - 用
document.hidden快速判断当前是否隐藏(布尔值,兼容性更好) - 注意:iOS Safari 在后台时可能冻结定时器和音频,但
visibilitychange仍会触发
暂停/恢复轮播图、动画与定时任务
页面不可见时继续运行轮播或 setInterval 是常见浪费。合理做法是:
- 监听
visibilitychange,在hidden时clearInterval或暂停requestAnimationFrame循环 - 切回
visible时重置计时逻辑(比如重新开始倒计时,而非累积补帧) - 视频自动播放策略也应配合:隐藏时
pause(),显示时按需play()(注意浏览器自动播放策略限制)
延迟上报与节流用户行为数据
用户切走后还持续发埋点请求,既无效又增加服务压力。可这样优化:
- 页面隐藏时暂存关键行为(如表单输入、滚动位置、停留时长)到内存或
sessionStorage - 切回可见时批量上报,或结合
setTimeout延迟几秒再发(避免频繁切换造成抖动) - 对“页面停留时长”类指标,用
visibilitychange时间戳计算真实可见时长,比单纯依赖beforeunload更准确
避免误判:注意兼容性与特殊场景
虽然现代浏览器支持良好,但仍需留意:
- IE10+ 和所有主流新版浏览器均支持,但需用
document.webkitHidden等前缀做降级(仅旧版 Safari/Chrome) - 移动端 WebView 行为不一:部分安卓 WebView 不触发
hidden,或锁屏后延迟触发;建议加超时兜底 -
visibilityState不代表网络连接状态或页面是否被冻结,它只反映视觉可见性
用好 Page Visibility API,不是为了“知道用户在哪”,而是让页面更懂何时该安静、何时该响应。不复杂但容易忽略。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











