jstutorial 之 Page Visibility API:页面可见性检测与后台资源管控实战指南
教程文档【免费下载链接】jstutorialJavascript tutorial book项目地址https://gitcode.com/gh_mirrors/js/jstutorial点击查看免费下载页面可见性是前端工程师最容易忽略、却在移动端与后台任务场景中至关重要的一环。本文以 jstutorial 仓库中 htmlapi/pagevisibility.md 为骨架结合仓库内 dom/document.md、jquery/basic.md、bom/window.md 等配套文档系统讲解 Page Visibility API 的三大核心成员document.visibilityState、document.hidden、visibilitychange事件及其在页面卸载监听、轮询暂停、动画与媒体播放控制中的实战用法帮助读者掌握一套比beforeunload/unload更可靠的页面生命周期感知方案。为什么需要 Page Visibility API传统上开发者通常监听下面三个事件来判断用户是否离开当前页面pagehidebeforeunloadunload问题的关键在于在手机上这些事件可能根本不会发生页面就直接被关闭了。因为手机操作系统可能会直接清除浏览器进程导致这些事件无法触发。典型场景包括用户点击了一条系统通知切换到另一个 App。用户进入任务切换窗口切换到另一个 App。用户点击了 Home 按钮切换回主屏幕。操作系统自动切换到另一个 App比如收到一个电话。上面这些情况都会导致浏览器进程切换到后台。为了节省资源手机可能就会自动终止一些后台进程而传统事件监听无法感知这一切。为了解决这个问题Page Visibility API 应运而生。不管是手机还是桌面电脑所有情况下这个 API 都会监听到页面可见性的变化——即使进程被系统切换或清除可见性状态的变化也总是可以被捕获。除了判断网页卸载监听页面可见性还可以用来暂停或终止下面这些网页行为以便节省资源、减缓电能的消耗对服务器的轮询网页动画正在播放的音频或视频从仓库结构看jstutorial 将本文档归入 htmlapi 目录HTML API 专题与 fullscreen.md、requestanimationframe.md、websocket.md 等一同构成浏览器能力图谱而在 dom/document.md 的“文档状态属性”一节中document.hidden与document.visibilityState也被明确标注为“Page Visibility API 引入的”属性可见该 API 是贯穿 DOM 文档模型与 HTML 能力层的基础设施。document.visibilityState页面当前的可见状态Page Visibility API 主要在document对象上新增了一个document.visibilityState属性。该属性返回一个字符串表示页面当前的可见性共有三个可能的值hidden页面彻底不可见。visible页面完全可见或一部分可见。prerender页面即将或正在渲染处于不可见状态。其中hidden状态和visible状态是所有浏览器都必须支持的prerender状态只在支持“预渲染”的浏览器上才会出现。比如 Chrome 浏览器就有预渲染功能可以在用户不可见的状态下预先把页面渲染出来等到用户要浏览的时候直接展示渲染好的网页。需要特别注意visible的判定边界只要页面可见哪怕只露出一个角document.visibilityState就返回visible。只有以下四种情况才会返回hidden浏览器最小化。浏览器没有最小化但是页面切换成了背景页。浏览器将要卸载unload页面。操作系统触发锁屏屏幕。可以看到上面四种场景涵盖了页面可能被卸载的所有情况。也就是说页面卸载之前document.visibilityState属性一定会变成hidden。事实上这也是设计这个 API 的主要目的。此外早期版本的 API 中这个属性还有第四个值unloaded表示页面即将卸载现在已经被废弃了。仓库中较早编写的 dom/document.md 仍保留着四种取值的旧版描述阅读时需注意以本文档为准。关于作用范围还有一条容易踩坑的规则document.visibilityState只针对顶层窗口。内嵌的iframe页面的document.visibilityState由顶层窗口决定——使用 CSS 属性隐藏iframe页面比如display: none;并不会影响内嵌页面的可见性。document.hidden历史遗留的布尔值由于历史原因这个 API 还定义了document.hidden属性。该属性只读返回一个布尔值表示当前页面是否可见当document.visibilityState返回visible时document.hidden返回false其他情况下都返回true。需要明确的是该属性只是出于历史原因而保留的。只要有可能都应该使用document.visibilityState属性而不是使用document.hidden。因为字符串状态比布尔值携带了更多信息例如prerender状态无法用布尔值表达且document.visibilityState才是规范演进的方向。仓库中 dom/document.md 对document.hidden的描述也与之一致窗口最小化、浏览器切换 Tab 都会导致该属性返回true。visibilitychange 事件跟踪可见性变化的标准入口只要document.visibilityState属性发生变化就会触发visibilitychange事件。因此可以通过监听这个事件——使用document.addEventListener()方法或document.onvisibilitychange属性——来跟踪页面可见性的变化。最基本用法如下document.addEventListener(visibilitychange, function () { // 用户离开了当前页面 if (document.visibilityState hidden) { document.title 页面不可见; } // 用户打开或回到页面 if (document.visibilityState visible) { document.title 页面可见; } });上面代码是 Page Visibility API 的最基本用法可以监听可见性变化并即时反馈到页面标题上。下面是一个更贴近实际业务的例子一旦页面不可见就暂停视频播放回到页面时恢复播放。var vidElem document.getElementById(video-demo); document.addEventListener(visibilitychange, startStopVideo); function startStopVideo() { if (document.visibilityState hidden) { vidElem.pause(); } else if (document.visibilityState visible) { vidElem.play(); } }这套“进入后台即暂停、回到前台即恢复”的模式同样适用于轮询请求、动画循环和音频播放是移动端省电、省流量的核心手段。在 jQuery 项目中监听 visibilitychange对于使用 jQuery 的项目仓库的 jquery/basic.md 给出了“检查用户是否切换浏览器 tab”的等价写法事件对象上的target指向document可以直接读取visibilityState$(document).on(visibilitychange, function (e) { if (e.target.visibilityState visible) { console.log(Tab is now in view!); } else if (e.target.visibilityState hidden) { console.log(Tab is now hidden!); } });两种写法本质相同addEventListener是原生 API 的标准入口jQuery 的.on()则提供了统一的跨浏览器绑定语法适合已经全面引入 jQuery 的页面。页面卸载为什么 visibilitychange 比 unload 更可靠下面专门讨论一个实践中的高频问题如何正确监听页面卸载。页面卸载可以分成三种情况页面可见时用户关闭 Tab 页或浏览器窗口。页面可见时用户在当前窗口前往另一个页面。页面不可见时用户或系统关闭浏览器窗口。这三种情况都会触发visibilitychange事件。前两种情况该事件在用户离开页面时触发最后一种情况该事件在页面从可见状态变为不可见状态时触发。由此可见visibilitychange事件比pagehide、beforeunload、unload事件更可靠所有情况下都会触发从visible变为hidden。因此可以只监听这个事件运行页面卸载时需要执行的代码而无需监听后面那三个事件。甚至可以这样说unload和beforeunload事件在任何情况下都不必监听。仓库中 bom/window.md 列出了window对象上的相关事件监听属性可作为对比参照window.onbeforeunloadbeforeunload事件的监听函数。window.onpagehidepagehide事件的监听函数。window.onunloadunload事件的监听函数。虽然这些监听属性在window上均可挂载但正如上文分析移动端进程被系统回收时它们无法可靠触发而 Page Visibility API 通过可见性状态的变化为“页面即将结束”提供了一个全覆盖的信号——这正是它作为卸载监听替代方案的根本原因。实践建议围绕可见性构建资源管控综合本文内容可将 Page Visibility API 的典型落地场景归纳如下卸载清理在visibilitychange中检测hidden状态统一执行数据上报、草稿保存、连接释放等收尾逻辑替代不可靠的unload系列事件。轮询暂停页面进入后台时停止对服务器的轮询请求如股票行情、消息提醒接口回到前台时立即恢复并主动拉取一次最新数据。动画与渲染降级后台时暂停requestAnimationFrame动画循环或 CSS 动画配合 requestanimationframe.md 中介绍的定时器方案一起使用降低 CPU 与电池消耗。媒体播放控制如本文视频示例所示hidden时暂停音视频、visible时恢复避免后台持续播放浪费流量。页面标题反馈切换 Tab 时通过修改document.title提示用户有内容更新提升回访体验。需要重申两条边界document.visibilityState与visibilitychange只作用于顶层窗口iframe 内页面的可见性由顶层窗口决定同时优先使用visibilityState而非历史遗留的document.hidden。延伸阅读Page Visibility API 原始文档本文的骨架与规范解读来源。文档状态属性document.hidden 与 visibilityStateDOM 视角下的属性说明与早期unloaded取值记录。jQuery 事件绑定中的 visibilitychange 示例jQuery 项目中的等价监听写法。window 对象的事件监听属性beforeunload、pagehide、unload等传统卸载事件在window上的挂载方式。requestAnimationFrame 专题页面动画与后台渲染控制的配合方案。以上内容均可在本仓库中对照查阅结合源码文档理解 API 的行为细节与演进脉络。赞分享教程文档【免费下载链接】jstutorialJavascript tutorial book项目地址https://gitcode.com/gh_mirrors/js/jstutorial点击查看免费下载相关推荐对比评测ICT-FaceKit Light与完整版模型的功能差异对比评测ICT FaceKit Light与完整版模型的功能差异 ICT FaceKit是由ICT视觉与图形实验室开发的可变形人脸模型工具包提供了从人脸建模ahooks useDocumentVisibility 深度解析基于 Page Visibility API 监听页面可见状态的 React Hookahooks useDocumentVisibility 深度解析基于 Page Visibility API 监听页面可见状态的 React Hook 导读前端3步快速部署打造企业级AI对话平台全攻略3步快速部署打造企业级AI对话平台全攻略 Chatbot UI是一款基于Next.js 14构建的开源AI对话界面支持集成OpenAI、Anthropic、人工智能AI 应用前端后端交互助手上一篇用 Go 打造 90DaysOfDevOps 进度推文机器人Twitter API 接入、推文发送与跨平台编译实战Day 13下一篇终极指南Nuclide模板导入验证全流程——从语法检查到错误处理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

服务端模板注入(SSTI)深解析:从探测到防御实战指南

服务端模板注入(SSTI)深解析:从探测到防御实战指南

1. 从一条报错到服务器权限:SSTI注入到底是怎么发生的先聊个真实的场景。某次做安全评估,目标是一个看起来平平无奇的企业官网,功能是给用户提供在线文档模板生成。页面有个"输入姓名生成个性化欢迎页"的小功能,我随手输…

2026/10/13 7:31:05 阅读更多 →
XSS绕过方法核心逻辑与防御:从编码到上下文逃逸

XSS绕过方法核心逻辑与防御:从编码到上下文逃逸

做Web安全的人&#xff0c;基本都会经历一个阶段&#xff1a;觉得XSS很简单&#xff0c;不就是<script>、onerror、javascript:那几招&#xff1b;再往后又会发现&#xff0c;好像随便写点什么东西都能被过滤掉&#xff0c;于是开始研究XSS攻击绕过方法。我当年也是这样&…

2026/10/13 7:31:04 阅读更多 →
JSP+Servlet实现的彝族文化服饰交易平台毕业设计全解析

JSP+Servlet实现的彝族文化服饰交易平台毕业设计全解析

彝族文化服饰交易平台这类题目&#xff0c;我这些年见过不少学生做类似的“行业电商”组合。说实话&#xff0c;选这个题的人很多&#xff0c;但真正能讲清楚设计思路、把JSP这套老技术栈玩明白的没几个。这篇东西我就按毕业设计的标准流程&#xff0c;从选题定位、架构设计、数…

2026/10/13 7:31:04 阅读更多 →

最新新闻

游戏出海新路径:经销商合作计划如何破解本地支付与销售难题

游戏出海新路径:经销商合作计划如何破解本地支付与销售难题

1. 项目概述&#xff1a;游戏出海&#xff0c;为什么靠经销商打开本地市场反而更靠谱&#xff1f;做游戏出海的这两年&#xff0c;我越来越意识到一个容易被忽略的真相&#xff1a;渠道的本地化&#xff0c;往往比内容的本地化更难&#xff0c;也更重要。很多开发者以为把游戏文…

2026/10/13 8:17:34 阅读更多 →
长尾关键词挖掘与内容布局:网站SEO流量稳步提升的核心策略

长尾关键词挖掘与内容布局:网站SEO流量稳步提升的核心策略

做SEO时间长了&#xff0c;你对“词”的态度会慢慢变化。刚入行时总盯着行业大词&#xff0c;整天想的是哪天真把一个高搜索量词做到首页就好。后来做过几个不同行业的站点&#xff0c;反而越来越踏实地在做一件事&#xff1a;把长尾关键词的挖掘和内容布局当日常。真正让一个网…

2026/10/13 8:17:34 阅读更多 →
WebGL Fundamentals:二维图形缩放(2D Scale)实战详解

WebGL Fundamentals:二维图形缩放(2D Scale)实战详解

图形学 【免费下载链接】webgl-fundamentals WebGL lessons that start with the basics 项目地址&#xff1a; https://gitcode.com/gh_mirrors/we/webgl-fundamentals 点击查看 免费下载 本教程出自 webgl-fundamentals 开源仓库的 WebGL 基础系列&#xff08;日语版见 webg…

2026/10/13 8:17:34 阅读更多 →
COMSOL多物理场耦合实现三维材料损伤模拟

COMSOL多物理场耦合实现三维材料损伤模拟

1. 项目背景与核心价值在工程仿真领域&#xff0c;材料损伤模拟一直是极具挑战性的课题。传统有限元软件往往只能实现简单的线性损伤模型&#xff0c;而COMSOL Multiphysics凭借其强大的多物理场耦合能力和用户自定义功能&#xff0c;为复杂损伤行为的精确模拟提供了可能。这个…

2026/10/13 8:17:34 阅读更多 →
城市通勤轮胎选择指南:性能平衡与安全考量

城市通勤轮胎选择指南:性能平衡与安全考量

1. 城市通勤轮胎选择的核心考量城市道路环境对轮胎的考验远比我们想象中复杂。柏油路面、水泥接缝、减速带、井盖、施工路段碎石......这些日常通勤中频繁遇到的路况&#xff0c;都在无声地考验着轮胎的性能边界。作为每天与地面直接接触的部件&#xff0c;轮胎的选择直接关系到…

2026/10/13 8:17:34 阅读更多 →
Schema标记实战:用结构化数据占据整个SERP

Schema标记实战:用结构化数据占据整个SERP

1. "占据整个SERP"到底是怎么回事&#xff1a;从一次搜索结果截图说起先别急着上代码&#xff0c;我们得先搞清楚一个问题&#xff1a;所谓"占据整个SERP"&#xff0c;到底长什么样&#xff1f;去年我接手了一个垂直电商的小项目&#xff0c;卖的是某种小众…

2026/10/13 8:16:34 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目&#xff0c;我最大的感受是&#xff0c;大部分坑不是出在技术前沿&#xff0c;而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节&#xff0c;最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了&#xff0c;很难不碰到舵机控制这道坎。做智能小车要转方向&#xff0c;做机械臂要抬关节&#xff0c;做云台要偏航俯仰&#xff0c;背后都是同一个东西在干活&#xff1a;舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”&#xff1f;——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台&#xff1f;或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜&#xff1f;又或者&#xff0c;在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →