新增 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>
58 lines
4.9 KiB
JavaScript
58 lines
4.9 KiB
JavaScript
/* 孕期计算器共用小工具(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 { '&': '&', '<': '<', '>': '>', '"': '"' }[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);
|