无法异步捕捉系统回收前兆;只能在freeze事件或pagehide且event.persisted===true时同步保存轻量可序列化状态,冷启动还原需通过pageshow且event.persisted===false识别并精准恢复。

无法异步捕捉系统回收前兆。“回收前兆”本身不是标准状态,Page Lifecycle API 中没有提供可监听的“即将被 discard”事件。浏览器在决定丢弃页面时,不给 JavaScript 任何通知机会——discarded 状态完全不可捕获,JS 执行环境已被彻底终止。
真正可用的同步保存窗口只有两个
你只能在系统冻结(freeze)或缓存(bfcache)前,用同步方式完成状态落盘:
- freeze 事件:页面即将被冻结(Frozen),JS 尚可执行、DOM 可读、定时器未停摆——这是最可靠、最通用的保存时机
- pagehide 且 event.persisted === true:说明页面将进入 bfcache 或 Frozen 状态,是 freeze 的重要补漏机制(尤其对部分 Safari 和旧版 WebView)
保存内容必须轻量、可序列化、无副作用
避免在 freeze 中做任何可能失败或阻塞的操作:
- 只用 localStorage.setItem() 或 sessionStorage.setItem() 同步写入;禁用 indexedDB、fetch、sendBeacon
- 序列化前剔除函数、DOM 节点、undefined、循环引用;仅保留 input.value、scrollY、选中索引等原始值
- 加 try/catch 包裹整个保存逻辑,出错即静默忽略,绝不能 throw 或 await
还原需主动识别 discard 冷启动场景
用户切回被丢弃的页面时,实际是一次全新加载(navigation),唯一线索是:
- pageshow 事件触发,且 event.persisted === false
- 配合 localStorage 中的时间戳(如 lastSavedAt),若距当前 >5 分钟,大概率已 discard
- 检查 URL 是否含 ?_reloaded=1(需你在上一次 pagehide/freeze 中主动写入)
还原动作要精准、非侵入
冷启动还原 ≠ 页面初始化。此时 DOM 已重建,但状态为空:
- 从 localStorage 读取并解析草稿,填入 textarea/input;恢复 window.scrollTo(x, y)
- 不重绑事件、不重复初始化组件、不 reload 页面
- 若表单有校验态或编辑标记,需一并还原 class 或 dataset 属性
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










