页面隐藏时暂停长任务切片执行,核心是监听 visibilitychange 事件并在每轮切片前检查 document.hidden,为 true 时中止执行;恢复可见后依任务类型决定延后恢复或断点续传,并在所有入口处做防御性判断。

页面隐藏时暂停长任务切片执行,核心是监听 visibilitychange 事件,并结合任务调度逻辑主动中止或暂缓切片的继续执行。
监听页面可见性变化
通过 document.visibilityState 和 visibilitychange 事件可实时感知页面是否被切换到后台(如用户切到其他标签页、最小化浏览器):
- 当
document.visibilityState === 'hidden'时,应暂停后续切片; - 恢复为
'visible'时,可选择继续执行剩余切片或重新调度。
在切片调度器中集成可见性判断
不要依赖全局定时器(如 setTimeout)硬性推进,而应在每次切片执行前检查可见性:
- 使用
requestIdleCallback时,它本身会在页面隐藏时自动暂停回调,但兼容性和控制粒度有限; - 更可靠的方式是手写切片循环,在每轮开始前加判断:
if (document.hidden) return; // 中止本次及后续切片 - 配合标志位(如
isPaused = true)和队列状态,避免重复暂停或漏恢复。
安全恢复执行的时机处理
页面重新可见后,不能直接“接着上次断点”执行——需考虑用户等待体验与任务时效性:
- 对非实时敏感任务(如日志上报、缓存预加载),可延后几秒再恢复,避免争抢资源影响首屏交互;
- 对有状态的任务(如分块解析大 JSON),需保存当前索引/偏移量,恢复时从断点继续;
- 建议用
setTimeout(..., 0)或queueMicrotask延迟一帧再启动,避开可能的渲染阻塞。
补充:避免 hidden 状态下意外触发
某些浏览器在页面 hidden 时仍可能执行部分 JS(如 Service Worker 消息、setTimeout 到期),因此:
- 所有长任务切片入口处都应做
if (document.hidden) return;防御; - 避免在 hidden 期间注册新的定时器或
requestIdleCallback; - 若使用
IntersectionObserver或ResizeObserver触发任务,也需同步检查document.hidden。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











