返回展品页为什么初始化两遍,怎样区分 pageshow 与首次加载

2026-10-24

pageshow 会在页面初次展示和部分历史恢复场景出现,不能把每次 pageshow 都当成一个全新的文档。初始化应有明确所有权与幂等保护,persisted 只按浏览器实际事件记录,不预设 bfcache 必然命中。

把文档实例和展示次数分开

夹具给每个新文档生成随机docId,挂载函数只在当前文档第一次调用时增加mounts。脚本从A页导航到本地B页,再后退,事件日志写入同源sessionStorage,返回后仍能查看前一次pagehide。若浏览器复用原文档,docId相同;若重新加载,docId不同,但每份文档里的mounts仍应是1。

初次展示也会触发pageshow

若代码既在脚本初始化时绑定控件,又在每次pageshow里无条件再绑定,同一文档初次展示就可能重复。附件通过ensureMount把重复调用转成无副作用,不靠猜load与pageshow哪个先执行来保证次数。真实工程应把需要每次恢复刷新的轻量状态更新与只应创建一次的监听器、定时器分开,不能全部塞进一个初始化函数。

缓存恢复不能伪造出来

程序读取原生事件的persisted值和docId,不人工dispatch任何页面生命周期事件,也不要求后退一定命中bfcache。自动化、浏览器启动参数、页面能力与运行条件都可能影响缓存资格。若本次记录全为false,就只能证明发生了重新展示或重载分支;它仍能验证幂等初始化,但不能作为缓存恢复成功的证据。

离开时不要破坏恢复语义

页面可能被缓存而非销毁,清理策略要区分暂停与最终释放;盲目在pagehide销毁全部状态,却在恢复时不重建,也会导致黑屏。这个实验只用简单挂载计数,没有媒体或业务连接。目标展项应追加真实播放器资源、恢复时旧状态更新与后台任务处理,并记录未恢复原因;不能把本例的一次后退当长期浏览器可靠性验收。

本次后退走的是重载分支

本次首次与返回的docId不同,persisted记录均为false,没有得到bfcache恢复命中的证据。两个文档各自mounts都为1,证明当前幂等入口没有因初次pageshow重复创建。测试不能因此声称缓存恢复分支已测;若目标浏览器后续出现persisted=true,应检查同一文档重现时是否仍只挂载一次,并单独保留那次原生事件记录。

下载并复现

下载原创HTML夹具、独立验证程序、本次执行记录和依赖与运行说明,放在同一目录。安装Playwright 1.58.0及其Chromium后运行 python verify.py;程序使用两个随机本地端口,自动关闭浏览器与服务,不请求外网或业务接口。

本题还必须下载导航B页,与fixture.html放在同一目录;程序会实际访问该页再后退。

本次实际环境为Python 3.12.4、Playwright 1.58.0、Chromium 145.0.7632.6。本地导航、后退与原生页面事件;本次未命中bfcache。断言已通过;完整事件和数值保留在执行记录,不能把它改名后当目标展项测量。

继续核查与一级出处

基础背景见展会软件的可靠性三件套:崩溃自恢复、超时回待机、全屏锁定。页面挂载次数正确后,再检查旧监听器是否被可靠清理,可继续用页面切回来一次按钮多响应一次,怎样用 AbortController 清理旧监听取证;相关工程入口在专题与产品对接说明。

需要展厅软硬件方案或定制开发?

加微信,把这一页发到你手机上

扫码加站长企业微信,会自动把这一页的链接发给你。问软件授权、报价,或者现场遇到问题,也可以直接聊。

去留微信

留言讨论

评论发布后会被人工复核,违规内容将被删除。

    还没有人评论,来说说你的看法

    如果发表没有反应,可以前往联系我们告诉我们。

    这个页面有问题?

    提交时会附带当前页面地址和浏览器信息,帮助我们定位问题。不填联系方式即为匿名。