页面崩溃或无响应需通过BOM主动监控运行状态:①每30秒采样DOM节点数,连续3次增量超200则告警;②定期检测根节点是否被清空;③监听可见性与requestIdleCallback延迟判断主线程繁忙;④检查iframe嵌套及location安全性。

页面崩溃或无响应(如白屏、卡死、主线程 100% 占用但控制台无报错)往往不是 JS 异常,而是 DOM 解析器级故障或资源耗尽导致,Sentry 等传统监控工具无法捕获。BOM 提供了轻量、原生、无需依赖框架的检测手段,关键在于绕过“异常监听”思路,转向对浏览器运行状态的主动观测。
监控 DOM 节点数异常增长
DOM 泄漏或劣化常表现为节点数量持续线性上升,是崩溃前最稳定可测的信号。利用 BOM 的全局访问能力,定时采样并比对:
- 每 30 秒执行
document.querySelectorAll('*').length,记录时间戳与数值 - 若连续 3 次采样差值均 >200,触发告警(说明可能有未销毁的动态插入节点)
- 避免高频采集阻塞主线程,可用
requestIdleCallback包裹,设timeout: 1000防止卡顿
检测 document 根节点是否被意外清空
第三方 SDK 或 document.write 调用可能导致整个 DOM 树被重置,此时 document.documentElement 仍存在但子节点丢失。这是崩溃的强征兆:
- 定期调用
document.documentElement.cloneNode(false)(仅克隆根节点,开销极低) - 检查
clone.children.length === 0且document.body?.childElementCount === 0 - 若同时成立,大概率已发生强制重载或脚本覆盖,应立即上报并尝试恢复
监听页面可见性与空闲状态异常
当页面长时间不可见(visibilityState === 'hidden')但主线程未释放资源,或 requestIdleCallback 长期不触发,都暗示调度异常:
立即学习“Java免费学习笔记(深入)”;
- 监听
document.addEventListener('visibilitychange', ...),若页面切后台后内存持续上涨,需排查定时器或未取消的动画帧 - 在
requestIdleCallback中记录执行延迟,若平均延迟 >500ms 或超时频发,说明主线程长期繁忙,存在卡死风险 - 结合
performance.memory?.usedJSHeapSize(如支持)辅助判断内存压力
识别强制跳转或 iframe 嵌套导致的上下文失效
部分崩溃由恶意 iframe 嵌套或跨域跳转引发,表现为 window.location 可读但导航行为被拦截:
- 检查
window.top !== window.self,若为真,说明当前页被嵌入其他站点 - 尝试读取
window.top.location.href,若抛出SecurityError,说明跨域限制已生效,页面可能失去控制权 - 对关键操作(如路由跳转)加保护:跳转前确认
window.location可写且未被冻结(Object.isFrozen(window.location))


















