/* 11-07 用户:「在孕妈广场、笔记页或任何一个子页面,在小程序上刷新,刷新结束之后它会回到首页」。 原因:小程序刷新 / 重新进入只会加载首页地址;首页只恢复 App 表里的 H5 应用(last_app),首页自己的子页面不在表里。 做法:首页仓里的子页面(孕妈广场、笔记、我的投稿、测一测、专题页、计算器)一打开就把当前地址记在本机 localStorage「mmbox.lastsub.v1」= {u: 不带身份的路径+查询, h: 首页目录, at};页面里换笔记 / 换话题(pushState / replaceState)也跟着记。 首页被宿主重新加载时(没有 referrer、不是后退)按它回到这一页,逻辑在 app.js resumeSub()。 从别的应用后退回到子页面时,顺手清掉 last_app(同首页 clearLastAppOnBackHome),免得刷新被送回那个应用。 */ (function () { var K = 'mmbox.lastsub.v1'; var me = document.currentScript && document.currentScript.src; var home = me ? new URL('../', me).pathname : ''; if (!home) return; var DROP = /^(openid|unionid|t|_v|phone|nickname|avatar|__no_identity)$/; function save() { if (/[?&]_hv=1(&|$)/.test(location.search)) return; /* 11-09 小程序容器页(js/host-nav.js 开的):刷新只重载它自己,别记——首页被宿主重载时会被误送到这一页 */ try { /* 广场 / 测一测关着时 ugc.js 送回首页前会清掉这条记录(不在这里按 .ugc-off 判断:开关接口没回来前它默认是关,会误删) */ var q = new URLSearchParams(location.search), k = []; q.forEach(function (v, n) { if (DROP.test(n)) k.push(n); }); k.forEach(function (n) { q.delete(n); }); var s = q.toString(); localStorage.setItem(K, JSON.stringify({ u: location.pathname + (s ? '?' + s : ''), h: home, at: Date.now() })); } catch (e) {} } save(); ['pushState', 'replaceState'].forEach(function (fn) { var o = history[fn]; if (typeof o !== 'function') return; history[fn] = function () { var r = o.apply(this, arguments); setTimeout(save, 0); return r; }; }); addEventListener('popstate', save); addEventListener('pageshow', function (e) { if (e.persisted) save(); }); /* 11-07 二修:用户自己点了按钮才离开这页(返回 / 返回首页 / 底栏…)→ 记一个「用户导航」标记,首页见到它就不恢复、清记录。 小程序回前台 / 刷新时宿主是直接把 web-view 地址换成首页,页面里没有任何点按 → 没有标记 → 首页把人送回这一页。 (第一次修法看 document.referrer 是否同源:宿主在原页面里换地址,referrer 也是子页面,被误当成用户回首页、把记录清了。) */ var act = 0; ['pointerdown', 'touchstart', 'click', 'keydown'].forEach(function (ev) { addEventListener(ev, function () { act = Date.now(); }, true); }); addEventListener('pagehide', function () { try { if (Date.now() - act < 2500) sessionStorage.setItem('mmbox.usernav', String(Date.now())); } catch (e) {} }); /* 从别的应用后退回来 → 清 last_app */ try { var nav = performance.getEntriesByType && performance.getEntriesByType('navigation')[0]; var ref = document.referrer || ''; var back = (nav && nav.type === 'back_forward') || (ref.indexOf(location.origin + '/') === 0 && ref.indexOf('/mama-box') < 0); var m = ((location.hash || '') + '&' + (location.search || '')).match(/[#?&]openid=([^&#?]*)/); if (back && m && window.fetch) fetch('/api/mp/public/last-app?openid=' + m[1], { method: 'DELETE', keepalive: true }).catch(function () {}); } catch (e) {} })();