Files
mama-box/topic/_shared/calc.js
deploy 7cc154d9b3 v26110903 广场/专题/计算器/测一测在小程序里也开容器页,复制链接直达;容器页返回走 navigateBack
新增 js/host-nav.js(MBHost.open/back/home + 页内同站 <a> 拦截):
- 首页进广场、专题问题、百宝箱测一测/计算器 → 容器页;广场点笔记 → 容器页 ?n=
- 容器页(_hv=1)里笔记关闭、广场/专题/计算器返回 → navigateBack;广场「返回」tab → switchTab 首页
- 失败或不在小程序照旧本页跳转

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 14:06:03 +00:00

58 lines
4.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* 孕期计算器共用小工具(11-04 新增 10 个计算器用):返回 / 顶栏 / 禁回弹 / 北京时间日期 / 记住上次填的值。
页面:<script src="../_shared/calc.js"></script> 之后用 window.CK。 */
(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=26110902', 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()); }
function parse(v) { var m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(v || ''); return m ? Date.UTC(+m[1], m[2] - 1, +m[3]) : NaN; }
function fmt(t) { var d = new Date(t); return d.getUTCFullYear() + '-' + ('0' + (d.getUTCMonth() + 1)).slice(-2) + '-' + ('0' + d.getUTCDate()).slice(-2); }
function cn(t, y) { var d = new Date(t); return (y ? d.getUTCFullYear() + ' 年 ' : '') + (d.getUTCMonth() + 1) + ' 月 ' + d.getUTCDate() + ' 日'; }
function wd(t) { return '周' + '日一二三四五六'.charAt(new Date(t).getUTCDay()); }
function addMonths(t, n) { var d = new Date(t), y = d.getUTCFullYear(), m = d.getUTCMonth() + n, day = d.getUTCDate(), last = new Date(Date.UTC(y, m + 1, 0)).getUTCDate(); return Date.UTC(y, m, Math.min(day, last)); }
function money(n) { n = Math.round(n); return n >= 1e4 ? (Math.round(n / 100) / 100).toFixed(n >= 1e5 ? 1 : 2).replace(/\.?0+$/, '') + ' 万' : n.toLocaleString('zh-CN'); }
function esc(s) { return String(s == null ? '' : s).replace(/[&<>"]/g, function (c) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[c]; }); }
/* 本机记的孕期(首页同款键):{w 孕周, pp 产后};没有返回 null */
function preg() { try { var x = JSON.parse(localStorage.getItem('mmbox.gcwk.v1') || 'null'); return x && x.w ? x : null; } catch (e) { return null; } }
/* 预产期计算器填过的值 → 预产期时间戳(多个计算器共用,用户不用重复填) */
function savedDue() {
try {
var s = JSON.parse(localStorage.getItem('mmbox.edd.calc') || 'null'); if (!s) return NaN;
if (s.m === 'ivf') { var t = parse(s.tr); return isNaN(t) ? NaN : t + (+s.emb === 3 ? 263 : 261) * DAY; }
var l = parse(s.lmp); return isNaN(l) ? NaN : l + (280 + (+s.cy || 28) - 28) * DAY;
} catch (e) { return NaN; }
}
function store(key, def) {
var st = {}; Object.keys(def).forEach(function (k) { st[k] = def[k]; });
try { var sv = JSON.parse(localStorage.getItem(key) || 'null'); if (sv) Object.keys(def).forEach(function (k) { if (sv[k] != null) st[k] = sv[k]; }); } catch (e) {}
st.save = function () { var o = {}; Object.keys(def).forEach(function (k) { o[k] = st[k]; }); try { localStorage.setItem(key, JSON.stringify(o)); } catch (e) {} };
return st;
}
/* 分段按钮:<div class="seg" data-k="xx"><button data-v>…;点了写 st[k] 回调 */
function seg(el, st, k, cb) {
function ui() { [].forEach.call(el.children, function (b) { b.classList.toggle('on', String(b.dataset.v) === String(st[k])); }); }
el.addEventListener('click', function (e) { var b = e.target.closest('button'); if (!b) return; st[k] = isNaN(+b.dataset.v) || b.dataset.v === '' ? b.dataset.v : +b.dataset.v; ui(); cb(); });
ui(); return ui;
}
function shell() {
var sc = $('#scroll');
$('#back').addEventListener('click', function () {
if (window.MBHost && MBHost.back(function () { location.href = '../jisuan/' + location.search + location.hash; })) return; /* 11-09 容器页:回小程序上一页 */
if (document.referrer && document.referrer.indexOf(location.host) >= 0 && history.length > 1) history.back();
else location.href = '../jisuan/' + location.search + location.hash;
});
sc.addEventListener('scroll', function () { $('#bar').classList.toggle('on', sc.scrollTop > 8); }, { passive: true });
/* 禁止下拉回弹:固定外壳 + 容器滚动 + 到顶/到底时拦 touchmove */
var y0 = 0;
sc.addEventListener('touchstart', function (e) { y0 = e.touches[0].clientY; }, { passive: true });
sc.addEventListener('touchmove', function (e) {
var dy = e.touches[0].clientY - y0;
if ((sc.scrollTop <= 0 && dy > 0) || (sc.scrollTop + sc.clientHeight >= sc.scrollHeight - 1 && dy < 0)) e.preventDefault();
}, { passive: false });
document.addEventListener('touchmove', function (e) { if (!sc.contains(e.target)) e.preventDefault(); }, { passive: false });
}
g.CK = { $: $, DAY: DAY, today: today, parse: parse, fmt: fmt, cn: cn, wd: wd, addMonths: addMonths, money: money, esc: esc, preg: preg, savedDue: savedDue, store: store, seg: seg, shell: shell };
})(window);