host-nav:跳转标记只用真实 localStorage(maternal-bridge 镜像层会换掉 window.localStorage)+ cookie 兜底

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
deploy
2026-11-09 15:38:14 +00:00
parent c189813d28
commit 1c18dedf92
18 changed files with 50 additions and 21 deletions

View File

@@ -235,7 +235,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
@media (prefers-reduced-motion:reduce){.fade,.stage,.view.on,.mask.on{opacity:1;transform:none;transition:none;animation:none}}
</style>
<link rel="stylesheet" href="../../topic/_shared/quiz-skin.css?v=26110643"><!-- 11-07 答题页底色 / 卡片 -->
<script src="../../js/host-nav.js?v=26110907"></script>
<script src="../../js/host-nav.js?v=26110908"></script>
</head>
<body>
<svg class="hide" aria-hidden="true" xmlns="http://www.w3.org/2000/svg">

View File

@@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<!-- 11-04 UGC 总开关关着时本页不展示,直接回首页(js/ugc.js) -->
<script src="../js/host-nav.js?v=26110907"></script>
<script src="../js/host-nav.js?v=26110908"></script>
<script src="../js/login-gate.js?v=26110610"></script>
<script src="../js/ugc.js?v=26110702" data-guard></script>
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">

View File

@@ -19,7 +19,7 @@
<script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<!-- 共享助手:授权/跳商城/位置上报(分享卡片同步,见 docs/h5-auth-standard.md 第四节) -->
<script src="/common/wx-auth.js?v=26102601"></script>
<script src="js/host-nav.js?v=26110907"></script>
<script src="js/host-nav.js?v=26110908"></script>
<script src="js/login-gate.js?v=26110618"></script>
<!-- 11-05 用户:「消消乐的推广 banner 图,不要有外面白色的边框」→ 去掉 .game-promo 外层白底(mama-box.css 里和其他模块共用一条白底规则,这里单独盖掉;夜间同) -->
<style>.game-promo,html.night .game-promo{background:none!important;box-shadow:none!important;backdrop-filter:none!important;-webkit-backdrop-filter:none!important}

View File

@@ -34,14 +34,43 @@
u.searchParams.sort && u.searchParams.sort();
return u.pathname + u.search;
}
/* 11-09 产后恢复会话报:接了 maternal-bridge 的应用里 window.localStorage 被换成云端镜像(内存 Map),
标记写进镜像、新容器页读不到 → 误判成「直接打开」。这里只用浏览器真实的 localStorage:
加载时是原生的就抓住;已被换掉就从同源空白 iframe 里拿一份;标记另外再写一份 cookie 兜底。 */
var nat = null;
function isNative(x) { try { return !!x && Object.prototype.toString.call(x) === '[object Storage]'; } catch (e) { return false; } }
try { if (isNative(g.localStorage)) nat = g.localStorage; } catch (e) {}
function LS() {
if (nat) return nat;
try {
var f = document.createElement('iframe');
f.style.display = 'none'; f.setAttribute('aria-hidden', 'true');
(document.body || document.documentElement).appendChild(f);
if (isNative(f.contentWindow.localStorage)) nat = f.contentWindow.localStorage;
} catch (e) {}
return nat;
}
function getMark() {
try { var l = LS(), v = l && l.getItem(OK); if (v) return JSON.parse(v); } catch (e) {}
try { var m = document.cookie.match(/(?:^|;\s*)mbhost_open=([^;]*)/); if (m) return JSON.parse(decodeURIComponent(m[1])); } catch (e) {}
return null;
}
function setMark(v) {
try { var l = LS(); if (l) l.setItem(OK, v); } catch (e) {}
try { document.cookie = 'mbhost_open=' + encodeURIComponent(v) + ';path=/;max-age=30;SameSite=Lax'; } catch (e) {}
}
function clearMark() {
try { var l = LS(); if (l) l.removeItem(OK); } catch (e) {}
try { document.cookie = 'mbhost_open=;path=/;max-age=0'; } catch (e) {}
}
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); }
var m = getMark();
if (m && Date.now() - m.at < 30000 && key(m.u) === key(location.href)) { sessionStorage.setItem(CK, '1'); clearMark(); }
/* 11-09 用户:复制链接 / 分享直接打开的页面,返回首页就停在顶部,不要回到「自己上次点进笔记时」的首页位置 */
if (!isChild()) localStorage.removeItem(POS);
if (!isChild()) { var l = LS(); if (l) l.removeItem(POS); }
} catch (e) {}
})();
function toHome(fallback) {
@@ -72,7 +101,7 @@
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) {}
setMark(JSON.stringify({ u: c, at: at }));
m.navigateTo({
url: VIEW + '?url=' + encodeURIComponent(c),
fail: function () { at = 0; if (fallback) fallback(); else location.href = url; }

View File

@@ -6,7 +6,7 @@
*/
(function () {
/* 11-09 小程序「复制链接」直达:加载 js/host-nav.js(容器页返回走 navigateBack、页内链接开容器页) */
try { if (!window.MBHost && document.currentScript) { var hs = document.createElement('script'); hs.src = new URL('../../js/host-nav.js?v=26110907', document.currentScript.src).href; document.head.appendChild(hs); } } catch (e) {}
try { if (!window.MBHost && document.currentScript) { var hs = document.createElement('script'); hs.src = new URL('../../js/host-nav.js?v=26110908', document.currentScript.src).href; document.head.appendChild(hs); } } catch (e) {}
'use strict';
var D = window.TOPIC;
if (!D) return;

View File

@@ -3,7 +3,7 @@
(function (g) {
'use strict';
/* 11-09 小程序「复制链接」直达:加载 js/host-nav.js(容器页返回走 navigateBack、页内链接开容器页) */
try { if (!window.MBHost && document.currentScript) { var hs = document.createElement('script'); hs.src = new URL('../../js/host-nav.js?v=26110907', document.currentScript.src).href; document.head.appendChild(hs); } } catch (e) {}
try { if (!window.MBHost && document.currentScript) { var hs = document.createElement('script'); hs.src = new URL('../../js/host-nav.js?v=26110908', document.currentScript.src).href; document.head.appendChild(hs); } } catch (e) {}
var $ = function (s) { return document.querySelector(s); };
var DAY = 864e5;
function today() { var n = new Date(Date.now() + 288e5); return Date.UTC(n.getUTCFullYear(), n.getUTCMonth(), n.getUTCDate()); }

View File

@@ -171,7 +171,7 @@ b{color:var(--h)}
.nu:active,.nc li:active{transform:scale(.98)}
@media (prefers-reduced-motion:reduce){.fade,.fade .fi{opacity:1;transform:none;transition:none}}
</style>
<script src="../../js/host-nav.js?v=26110907"></script>
<script src="../../js/host-nav.js?v=26110908"></script>
</head>
<body>
<!-- 单色线性图标,stroke 1.8 -->

View File

@@ -178,7 +178,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
@media (prefers-reduced-motion:reduce){.fade,.stage,.view.on,.mask.on{opacity:1;transform:none;transition:none;animation:none}}
</style>
<link rel="stylesheet" href="../_shared/quiz-skin.css?v=26110643"><!-- 11-07 答题页底色 / 卡片 -->
<script src="../../js/host-nav.js?v=26110907"></script>
<script src="../../js/host-nav.js?v=26110908"></script>
</head>
<body>
<!-- 单色线性图标(每题一个场景图标 q-*) -->

View File

@@ -179,7 +179,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
@media (prefers-reduced-motion:reduce){.fade,.stage,.view.on,.mask.on{opacity:1;transform:none;transition:none;animation:none}}
</style>
<link rel="stylesheet" href="../_shared/quiz-skin.css?v=26110643"><!-- 11-07 答题页底色 / 卡片 -->
<script src="../../js/host-nav.js?v=26110907"></script>
<script src="../../js/host-nav.js?v=26110908"></script>
</head>
<body>
<!-- 单色线性图标(每题一个场景图标 q-*) -->

View File

@@ -278,7 +278,7 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
.mask .row button,.mask .row a{height:34px;padding:0 18px;border-radius:99px;border:1px solid rgba(255,255,255,.6);color:#fff;font-size:13.5px;line-height:32px;text-decoration:none}
@media (prefers-reduced-motion:reduce){.screen.on,.mask.on{animation:none}.fu{opacity:1;transform:none;transition:none}}
</style>
<script src="../../js/host-nav.js?v=26110907"></script>
<script src="../../js/host-nav.js?v=26110908"></script>
</head>
<body>
<svg class="hide" aria-hidden="true" xmlns="http://www.w3.org/2000/svg">

View File

@@ -45,7 +45,7 @@ button{font:inherit;border:0;background:none;color:inherit;cursor:pointer}
.mb-brand{text-align:center;color:#C29A8F;font-size:11.5px;line-height:1.7}.mb-brand img{display:block;width:86px;height:auto;margin:0 auto 6px;opacity:.6}.mb-brand p{display:flex;align-items:center;justify-content:center;gap:8px;margin:0;letter-spacing:.06em}.mb-brand p::before,.mb-brand p::after{content:'';width:28px;height:1px;background:#EAD3CC}
#scroll .mb-brand{margin:20px 0 0;padding-bottom:calc(120px + env(safe-area-inset-bottom))} /* 给底部 Tab 让位 */
</style>
<script src="../../js/host-nav.js?v=26110907"></script>
<script src="../../js/host-nav.js?v=26110908"></script>
</head>
<body>
<div id="scroll">

View File

@@ -184,7 +184,7 @@ h2{font-size:18px;font-weight:700;line-height:1.4;color:var(--ink)}
@media (prefers-reduced-motion:reduce){.fade{opacity:1;transform:none;transition:none}}
@media (max-width:370px){h1{font-size:26px}.pt b{font-size:13.5px}.bm{padding:9px 8px 11px}.bm .v{font-size:18px}}
</style>
<script src="../../js/host-nav.js?v=26110907"></script>
<script src="../../js/host-nav.js?v=26110908"></script>
</head>
<body>
<!-- 单色线性图标:stroke 1.8,颜色走 .ic(主色) -->

View File

@@ -197,7 +197,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
.care p+p{margin-top:8px}
</style>
<link rel="stylesheet" href="../_shared/quiz-skin.css?v=26110643"><!-- 11-07 答题页底色 / 卡片 -->
<script src="../../js/host-nav.js?v=26110907"></script>
<script src="../../js/host-nav.js?v=26110908"></script>
</head>
<body>
<!-- 单色线性图标(每题一个场景图标 q-*) -->

View File

@@ -178,7 +178,7 @@ h1 em{font-style:normal;background:linear-gradient(transparent 62%,rgba(240,138,
.fade.in{opacity:1;transform:none}
@media (prefers-reduced-motion:reduce){.fade{opacity:1;transform:none;transition:none}.amt .tr i{transform:none;transition:none}}
</style>
<script src="../../js/host-nav.js?v=26110907"></script>
<script src="../../js/host-nav.js?v=26110908"></script>
</head>
<body>
<svg width="0" height="0" style="position:absolute" aria-hidden="true">

View File

@@ -196,7 +196,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
.warn{margin-top:20px;padding:10px 14px;border-radius:14px;background:var(--cbg);color:#4F7F2A;font-size:13px;line-height:1.6;text-align:center}
</style>
<link rel="stylesheet" href="../_shared/quiz-skin.css?v=26110643"><!-- 11-07 答题页底色 / 卡片 -->
<script src="../../js/host-nav.js?v=26110907"></script>
<script src="../../js/host-nav.js?v=26110908"></script>
</head>
<body>
<!-- 单色线性图标(每题一个场景图标 q-*) -->

View File

@@ -72,7 +72,7 @@ button{cursor:pointer}
.foot{margin:14px 20px 0;font-size:12px;color:var(--m);text-align:center;line-height:1.6}
</style>
<link rel="stylesheet" href="../_shared/wizard.css?v=26110464">
<script src="../../js/host-nav.js?v=26110907"></script>
<script src="../../js/host-nav.js?v=26110908"></script>
</head>
<body>
<svg style="position:absolute;width:0;height:0" aria-hidden="true"><symbol id="i-back" viewBox="0 0 24 24"><path d="M15 5l-7 7 7 7"/></symbol></svg>

View File

@@ -205,7 +205,7 @@ html.cm:not(.cm-all) .cm-more{display:flex;align-items:center;justify-content:ce
<!-- 11-04 计算器模式(calc=1)走分步:一步一题、最后出结果,见 ../_shared/wizard.js -->
<link rel="stylesheet" href="../_shared/wizard.css?v=26110464">
<script src="../_shared/wizard.js?v=26110464"></script>
<script src="../../js/host-nav.js?v=26110907"></script>
<script src="../../js/host-nav.js?v=26110908"></script>
</head>
<body>
<svg class="hide" aria-hidden="true" xmlns="http://www.w3.org/2000/svg">

View File

@@ -197,7 +197,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
@media (prefers-reduced-motion:reduce){.fade,.stage,.view.on,.mask.on{opacity:1;transform:none;transition:none;animation:none}}
</style>
<link rel="stylesheet" href="../_shared/quiz-skin.css?v=26110643"><!-- 11-07 答题页底色 / 卡片 -->
<script src="../../js/host-nav.js?v=26110907"></script>
<script src="../../js/host-nav.js?v=26110908"></script>
</head>
<body>
<!-- 单色线性图标(每题一个场景图标 q-*) -->