v26110905 容器页:复制链接直接打开的页返回回小程序首页;首页广场笔记开容器页;首页回前台重载后回到原位置;容器页不记上次子页面
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -14,6 +14,10 @@
|
||||
MBHost.home(fallback) 同上条件 → switchTab 回小程序首页(首页壳是 tabBar 页,原来停的位置还在)
|
||||
⚠️ url 只放净地址:去掉 openid/unionid/__no_identity/return_url 和 hash 里的身份,复制出去不带分享人身份。
|
||||
⚠️ 加 _hv=1 只为让页面知道「我在容器页里」,返回时用 navigateBack,不用在容器里再开一个首页。
|
||||
11-09 二修(用户:「复制链接打开笔记,点左上角返回回不到首页」):复制链接 / 分享卡片直接打开的容器页没有上一页,
|
||||
navigateBack 不动。open() 换页前在本机记一笔 mbhost.open,新容器页加载时对上了 = 「从上一页点进来的」,
|
||||
本页 sessionStorage 记 mbhost.child;back() 只有 child 才 navigateBack,否则 switchTab 回小程序首页。
|
||||
MBHost.onLeave:open() 跳走前调一下(首页用来记滚动位置,宿主回前台重载首页后回到原位置)。
|
||||
============================================================ */
|
||||
(function (g) {
|
||||
'use strict';
|
||||
@@ -23,6 +27,29 @@
|
||||
function mp() { return g.wx && g.wx.miniProgram; }
|
||||
function inMp() { return g.__wxjs_environment === 'miniprogram' || /miniProgram/i.test(navigator.userAgent); }
|
||||
function inView() { return /[?&]_hv=1(&|$)/.test(location.search); }
|
||||
var OK = 'mbhost.open', CK = 'mbhost.child';
|
||||
function key(href) { /* 比对用:去掉容器注入的身份 / 时间戳参数 */
|
||||
var u = new URL(href, location.href);
|
||||
['openid', 'unionid', 't', '_v', '__no_identity'].forEach(function (k) { u.searchParams.delete(k); });
|
||||
u.searchParams.sort && u.searchParams.sort();
|
||||
return u.pathname + u.search;
|
||||
}
|
||||
function isChild() { try { return sessionStorage.getItem(CK) === '1'; } catch (e) { return false; } }
|
||||
(function () {
|
||||
if (!inView()) return;
|
||||
try {
|
||||
var m = JSON.parse(localStorage.getItem(OK) || 'null');
|
||||
if (m && Date.now() - m.at < 30000 && key(m.u) === key(location.href)) { sessionStorage.setItem(CK, '1'); localStorage.removeItem(OK); }
|
||||
} catch (e) {}
|
||||
})();
|
||||
function toHome(fallback) {
|
||||
var m = mp();
|
||||
if (!m || typeof m.switchTab !== 'function') { if (fallback) fallback(); return; }
|
||||
m.switchTab({ url: '/pages/index/index', fail: function () {
|
||||
if (typeof m.reLaunch === 'function') m.reLaunch({ url: '/pages/index/index', fail: function () { if (fallback) fallback(); } });
|
||||
else if (fallback) fallback();
|
||||
} });
|
||||
}
|
||||
function clean(url) {
|
||||
var u = new URL(url, location.href);
|
||||
['openid', 'unionid', '__no_identity', 'return_url', 'norestore'].forEach(function (k) { u.searchParams.delete(k); });
|
||||
@@ -33,6 +60,8 @@
|
||||
var H = {
|
||||
inMp: inMp,
|
||||
inView: inView,
|
||||
isChild: isChild,
|
||||
onLeave: null,
|
||||
open: function (url, fallback) {
|
||||
var m = mp();
|
||||
if (!inMp() || !m || typeof m.navigateTo !== 'function') return false;
|
||||
@@ -40,6 +69,8 @@
|
||||
var c;
|
||||
try { c = clean(url); } catch (e) { return false; }
|
||||
at = Date.now();
|
||||
try { if (typeof H.onLeave === 'function') H.onLeave(); } catch (e) {}
|
||||
try { localStorage.setItem(OK, JSON.stringify({ u: c, at: at })); } catch (e) {}
|
||||
m.navigateTo({
|
||||
url: VIEW + '?url=' + encodeURIComponent(c),
|
||||
fail: function () { at = 0; if (fallback) fallback(); else location.href = url; }
|
||||
@@ -49,13 +80,14 @@
|
||||
back: function (fallback) {
|
||||
var m = mp();
|
||||
if (!inView() || !inMp() || !m || typeof m.navigateBack !== 'function') return false;
|
||||
m.navigateBack({ delta: 1, fail: function () { if (fallback) fallback(); } });
|
||||
if (isChild()) m.navigateBack({ delta: 1, fail: function () { toHome(fallback); } });
|
||||
else toHome(fallback); /* 复制链接 / 分享直接打开:没有上一页 → 回小程序首页 */
|
||||
return true;
|
||||
},
|
||||
home: function (fallback) {
|
||||
var m = mp();
|
||||
if (!inView() || !inMp() || !m || typeof m.switchTab !== 'function') return false;
|
||||
m.switchTab({ url: '/pages/index/index', fail: function () { if (fallback) fallback(); } });
|
||||
toHome(fallback);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user