孕期计算器新增 10 个(孕周/产检时间表/增重范围/生育津贴/育儿补贴/个税/月子花费/身高/血型/出生后手续),共用 topic/_shared/calc.*,配转发图(v26110299)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
54
topic/_shared/calc.js
Normal file
54
topic/_shared/calc.js
Normal file
@@ -0,0 +1,54 @@
|
||||
/* 孕期计算器共用小工具(11-04 新增 10 个计算器用):返回 / 顶栏 / 禁回弹 / 北京时间日期 / 记住上次填的值。
|
||||
页面:<script src="../_shared/calc.js"></script> 之后用 window.CK。 */
|
||||
(function (g) {
|
||||
'use strict';
|
||||
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 (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);
|
||||
Reference in New Issue
Block a user