diff --git a/index.html b/index.html index 6af0508..9934141 100644 --- a/index.html +++ b/index.html @@ -7,7 +7,7 @@ 兜爸心选 · 孕育陪伴 - + diff --git a/js/app.js b/js/app.js index c5bcde5..02f26f4 100644 --- a/js/app.js +++ b/js/app.js @@ -3,7 +3,7 @@ (function () { 'use strict'; /* 页面版本号(YYMMDD+序号):显示在「关于兜爸心选」页底部;bump 时同步 head 注释与 ?v= */ - var VER = '26092202'; + var VER = '26092203'; const $ = (s, c) => (c || document).querySelector(s); const $$ = (s, c) => Array.from((c || document).querySelectorAll(s)); @@ -213,6 +213,46 @@ } catch (e) {} } + /* ================= 返回首页 → 清除 last_app(2026-09-22) ================= + 问题:用户进入 H5 应用后又退回 mama-box 首页,但记录还停在那个应用上 —— + 下次冷启动(普通入口)会把他又送回刚退出的应用(用户实测)。 + 记录的是「最后进入的 H5 应用」,用户已经回到首页,那首页才是他最后待的地方 → 必须清掉。 + ⚠️ 不能用「本页每次加载都清」:宿主恢复时会把 mama-box 当返回落点加载(#norestore=1), + 那时清掉会把刚用上的记录毁掉。 + 所以只认「这次是返回回到本页」的三种情形: + ① bfcache 恢复:pageshow 事件 persisted === true(脚本不重跑,只有这个事件) + ② 后退导致整页重载:navigation.type === 'back_forward' + ③ 从别的 H5 应用页以 location.href 回本页:document.referrer 是 https://mp.yizhezhe.com// + 宿主恢复/返回落点那两次加载都是 navigate + referrer 空 → 不会误清。 */ + let _lastAppCleared = false; + function isBackToThisPage() { + try { + const nav = window.performance && performance.getEntriesByType && performance.getEntriesByType('navigation')[0]; + if (nav && nav.type === 'back_forward') return true; + } catch (e) {} + try { + const ref = document.referrer || ''; + if (ref.indexOf('https://mp.yizhezhe.com/') === 0 && ref.indexOf('/mama-box') === -1) return true; + } catch (e) {} + return false; + } + function clearLastAppOnBackHome(persisted) { + try { + if (_lastAppCleared) return; + if (!persisted && !isBackToThisPage()) return; + const oid = hashParam('openid'); + if (!oid) return; + _lastAppCleared = true; + console.log('[enter-app] 返回 mama-box 首页 → 清除 last_app(persisted=' + !!persisted + + ',下次冷启动不再回上次那个应用)'); + if (window.fetch) { + fetch(LAST_APP_API + '?openid=' + encodeURIComponent(oid), { method: 'DELETE', keepalive: true }) + .catch(function () {}); + } + } catch (e) {} + } + /* ② 后退重载:脚本会重跑,init() 里调;① bfcache:整页不重载,挂在文件末尾已有的 pageshow 上 */ + function goArchiveH5() { const oid = hashParam('openid'); const uid = hashParam('unionid'); @@ -2495,6 +2535,9 @@ /* ================= 初始化 ================= */ function init() { + /* 返回首页 → 清 last_app(后退重载 / 从应用页 href 回来两种情形;bfcache 由 pageshow 处理)。 + 放在 resumeLastApp 之前:后退回来的会话里恢复闸门已占住,两者不会打架。 */ + clearLastAppOnBackHome(false); /* 冷启动恢复:读一次 last_app,命中就跳到上次进入的 H5 应用(会话内只尝试一次, 见 resumeLastApp)。放在最前面,尽量少闪一下首页。 */ resumeLastApp(); @@ -3012,7 +3055,9 @@ document.addEventListener('visibilitychange', function () { if (document.visibilityState === 'visible') resetScreenOnShow(); }); - window.addEventListener('pageshow', function () { + window.addEventListener('pageshow', function (e) { + /* bfcache 恢复(persisted=true)= 用户「返回」回到了本页 → 清掉 last_app(见 clearLastAppOnBackHome) */ + clearLastAppOnBackHome(!!(e && e.persisted)); if (document.visibilityState !== 'hidden') resetScreenOnShow(); });