50 lines
3.4 KiB
JavaScript
50 lines
3.4 KiB
JavaScript
/* 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() {
|
||
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) {}
|
||
})();
|