v26110905 容器页:复制链接直接打开的页返回回小程序首页;首页广场笔记开容器页;首页回前台重载后回到原位置;容器页不记上次子页面
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
41
js/app.js
41
js/app.js
@@ -3,7 +3,7 @@
|
||||
(function () {
|
||||
'use strict';
|
||||
/* 页面版本号(YYMMDD+序号):显示在「关于兜爸心选」页底部;bump 时同步 head 注释与 ?v= */
|
||||
var VER = '26110904';
|
||||
var VER = '26110906';
|
||||
const $ = (s, c) => (c || document).querySelector(s);
|
||||
const $$ = (s, c) => Array.from((c || document).querySelectorAll(s));
|
||||
|
||||
@@ -283,6 +283,45 @@
|
||||
/* 脚本一加载就判断,不等 init(init 挂在 load 上,要等图片全下完,太晚:用户已经刷新走了、记录还没清;跳转也会先闪首页) */
|
||||
const SUB_GONE = resumeSub();
|
||||
|
||||
/* ================= 回到首页原位置(2026-11-09 用户)=================
|
||||
「首页滑到孕妈广场点开一篇笔记,点返回没回到孕妈广场那个位置,而是重新加载了小程序」——
|
||||
小程序首页壳每次回前台(含从容器页 navigateBack 回来)都会给 web-view 换一个带 ?t= 的地址,首页整页重载(壳的代码在小程序里)。
|
||||
H5 这边能做的:MBHost.open 跳走前(onLeave)记下当前屏、滚动位置和最靠近屏幕顶的带 id 模块;
|
||||
首页再加载时(30 分钟内、只用一次)按那个模块对齐回去。数据陆续渲染会撑高页面,前 6 秒分几次对齐,用户一摸屏就停。 */
|
||||
const POS_KEY = 'mmbox.homepos.v1';
|
||||
function saveHomePos() {
|
||||
try {
|
||||
const sc = document.querySelector('.screen.is-active');
|
||||
if (!sc) return;
|
||||
const top = sc.getBoundingClientRect().top;
|
||||
let a = null, bd = 1e9;
|
||||
sc.querySelectorAll('[id]').forEach(el => {
|
||||
const r = el.getBoundingClientRect();
|
||||
if (r.height < 60 || r.bottom <= top) return;
|
||||
const d = Math.abs(r.top - top);
|
||||
if (d < bd) { bd = d; a = { id: el.id, off: r.top - top }; }
|
||||
});
|
||||
localStorage.setItem(POS_KEY, JSON.stringify({ s: sc.dataset.screen, y: sc.scrollTop, a, p: location.pathname, at: Date.now() }));
|
||||
} catch (e) {}
|
||||
}
|
||||
if (window.MBHost) window.MBHost.onLeave = saveHomePos;
|
||||
(function restoreHomePos() {
|
||||
let m = null;
|
||||
try { m = JSON.parse(localStorage.getItem(POS_KEY) || 'null'); localStorage.removeItem(POS_KEY); } catch (e) { return; }
|
||||
if (SUB_GONE || !m || m.p !== location.pathname || m.s !== 'home' || Date.now() - m.at > 30 * 60e3 || !(m.y > 0)) return;
|
||||
const sc = document.getElementById('screen-home');
|
||||
if (!sc) return;
|
||||
let stop = false;
|
||||
['touchstart', 'pointerdown', 'wheel'].forEach(ev => sc.addEventListener(ev, () => { stop = true; }, { once: true, passive: true }));
|
||||
const apply = () => {
|
||||
if (stop) return;
|
||||
const el = m.a && document.getElementById(m.a.id);
|
||||
if (el && el.getBoundingClientRect().height) sc.scrollTop += el.getBoundingClientRect().top - sc.getBoundingClientRect().top - m.a.off;
|
||||
else sc.scrollTop = m.y;
|
||||
};
|
||||
[0, 150, 400, 800, 1400, 2200, 3200, 4500, 6000].forEach(t => setTimeout(apply, t));
|
||||
})();
|
||||
|
||||
/* 首屏恢复:读一次 last_app,命中就带着当前身份 replace 过去。 */
|
||||
function resumeLastApp() {
|
||||
try {
|
||||
|
||||
@@ -42,7 +42,9 @@
|
||||
}
|
||||
/* 11-02 用户:「进广场首页太深,只能点详情再返回」→ 点帖子只带 ?n=(返回落在广场首页,不落在单个话题);话题标签才带 ?t= */
|
||||
function go(id, nid) {
|
||||
location.href = 'guangchang/' + (nid ? '?n=' + encodeURIComponent(nid) : id ? '?t=' + encodeURIComponent(id) : '') + location.hash;
|
||||
var u = 'guangchang/' + (nid ? '?n=' + encodeURIComponent(nid) : id ? '?t=' + encodeURIComponent(id) : '') + location.hash;
|
||||
if (window.MBHost && MBHost.open(u)) return; /* 11-09 小程序里开容器页:复制链接直达这篇;返回回首页原位置 */
|
||||
location.href = u;
|
||||
}
|
||||
|
||||
sec.className = sec.className.replace(/\bgv\d\b/g, '') + ' gv4';
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
if (!sec) return;
|
||||
var l = document.createElement('link'); l.rel = 'stylesheet'; l.href = 'js/gch/v4.css?v=26110464';
|
||||
document.head.appendChild(l);
|
||||
var s = document.createElement('script'); s.src = 'js/gch/v4.js?v=26110805';
|
||||
var s = document.createElement('script'); s.src = 'js/gch/v4.js?v=26110905';
|
||||
s.onload = function () { if (sec.querySelector('.g4-foot')) merge(); else sec.addEventListener('gc4-ready', merge, { once: true }); }; /* v4 要先拉 feed.js 才渲染 */
|
||||
document.body.appendChild(s);
|
||||
|
||||
@@ -169,7 +169,7 @@
|
||||
}, 3000 + Math.random() * 6000);
|
||||
})();
|
||||
}
|
||||
all.addEventListener('click', function () { location.href = 'guangchang/' + location.search + location.hash; });
|
||||
all.addEventListener('click', function () { var u = 'guangchang/' + location.search + location.hash; if (!(window.MBHost && MBHost.open(u))) location.href = u; });
|
||||
paintList();
|
||||
}
|
||||
})();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
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 = [];
|
||||
|
||||
Reference in New Issue
Block a user