v26110905 容器页:复制链接直接打开的页返回回小程序首页;首页广场笔记开容器页;首页回前台重载后回到原位置;容器页不记上次子页面

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
deploy
2026-11-09 14:32:16 +00:00
parent a9f57b4807
commit 74dc28c903
132 changed files with 223 additions and 149 deletions

View File

@@ -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;
}
};