如何利用Page Lifecycle API异步抓取页面回收瞬间,实现用户输入数据的恢复?
- 内容介绍
- 相关推荐
本文共计898个文字,预计阅读时间需要4分钟。
Page Lifecycle API 无法异步捕获 '系统回收瞬间',因为 discarded 状态本身不可监听——浏览器在进入该状态时已完全终止 JavaScript 执行环境,所有事件、定时器、fetch 请求、乃至 beforeunload 事件都不会触发。所谓‘捕获回收’,实质上是利用冻结前的可靠时机保存+加载时的多信号交叉判断,实现对用户输入的精确还原。
真正可用的保存时机只有 freeze 和 pagehide(persisted=true)
这两个事件是 JS 能安全执行并持久化数据的最后窗口:
- freeze 事件:页面即将进入 Frozen 阶段,DOM 可读、JS 可写,是保存表单草稿、滚动位置、选中状态等关键输入的首选时机
- pagehide 且 event.persisted === true:说明页面将被放入 bfcache 或 Frozen,后续可能直接 resume,也应同步保存(作为 freeze 的兜底)
- 避免依赖
visibilitychange或blur:它们只反映可见性或焦点变化,与系统是否冻结/丢弃无直接关系,中间存在不可控空窗期
保存内容要轻量、可序列化、带时间戳
冻结阶段不允许发起新请求、不能操作 DOM、不支持函数或复杂对象。
本文共计898个文字,预计阅读时间需要4分钟。
Page Lifecycle API 无法异步捕获 '系统回收瞬间',因为 discarded 状态本身不可监听——浏览器在进入该状态时已完全终止 JavaScript 执行环境,所有事件、定时器、fetch 请求、乃至 beforeunload 事件都不会触发。所谓‘捕获回收’,实质上是利用冻结前的可靠时机保存+加载时的多信号交叉判断,实现对用户输入的精确还原。
真正可用的保存时机只有 freeze 和 pagehide(persisted=true)
这两个事件是 JS 能安全执行并持久化数据的最后窗口:
- freeze 事件:页面即将进入 Frozen 阶段,DOM 可读、JS 可写,是保存表单草稿、滚动位置、选中状态等关键输入的首选时机
- pagehide 且 event.persisted === true:说明页面将被放入 bfcache 或 Frozen,后续可能直接 resume,也应同步保存(作为 freeze 的兜底)
- 避免依赖
visibilitychange或blur:它们只反映可见性或焦点变化,与系统是否冻结/丢弃无直接关系,中间存在不可控空窗期
保存内容要轻量、可序列化、带时间戳
冻结阶段不允许发起新请求、不能操作 DOM、不支持函数或复杂对象。

