Files
mama-box/js/kit.js

250 lines
21 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-03 孕期百宝箱(用户当天四轮改):
① 「把此刻那个板块改成测一测、科普、计算器」→ ② 「进去之后是列表页,名字改得大家看得懂」→ 三个入口:
趣味小测试 → 孕妈广场测试列表(guangchang/?c=ceshi);孕期百问 → 首页全部问题页(app.js openQA);孕期计算器 → topic/jisuan/
③ 「加上多少万人测过、算过」→ 卡上人数行(模拟数,AGENTS.md 12b,12-31 复核)
④ 「百宝箱单独拎出来做一个模块,下面放一个像『其他妈妈也在搜』的列表,三块各拿两个」→ 独立 section #kitHome(孕妈广场上面),
入口下面 6 条:测试 / 百问 / 计算器 交替各 2 条,按孕周挑,点了直达那一项。
原「此刻」#pulse 只是藏起来(kit.css),JS 照跑(别处要用它的总人数);地址带 ?kit=0 可看回旧版。 */
(function () {
if (/[?&]kit=0(?:&|$)/.test(location.search)) return;
var box = document.getElementById('kit'), sec = document.getElementById('kitHome');
if (!box || !sec) return;
var V = '26110447';
var l = document.createElement('link'); l.rel = 'stylesheet'; l.href = 'js/kit.css?v=' + V; document.head.appendChild(l);
document.documentElement.classList.add('has-kit');
function esc(t) { return String(t == null ? '' : t).replace(/[&<>"]/g, function (c) { return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[c]; }); }
function cleanQ(extra) {
var q = new URLSearchParams(location.search);
['t', 'n', 'c', 'id', 'mine', 'write', 'fav', 'kit'].forEach(function (k) { q.delete(k); });
if (extra) Object.keys(extra).forEach(function (k) { q.set(k, extra[k]); });
var s = q.toString(); return (s ? '?' + s : '') + location.hash;
}
function wan(n) { return n >= 1e6 ? Math.round(n / 1e4) + '万' : n >= 1e4 ? (Math.round(n / 1e3) / 10) + '万' : String(Math.round(n)); } /* 百万以上取整,卡片窄放得下 */
/* 入口专用:万为单位、必带一位小数,碰上整数(如 68.0)挪 0.3,避免看着像凑的整数 */
function wanX(n) { var v = Math.round(n / 1e3) / 10; if (v % 1 === 0) v = +(v + .3).toFixed(1); return v.toFixed(1) + '万'; }
function total() { var p = window.__mbPulse; return (p && p.total && +p.total.value) || 1510000; }
var FIRE = '<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12.6 2.5c.4 3-1.6 4.6-3 6.2C8 10.4 7 12 7 14.3A5 5 0 0012 19.5a5 5 0 005-5.2c0-2-1-3.6-1.9-4.6-.2 1.3-.9 2.2-1.9 2.6.6-3.4-.2-7-.6-9.8z" fill="currentColor"/></svg>';
/* ---------- 上:三个入口 ---------- */
var E = [
/* 11-04 用户:三个入口顺序改为 孕期百问 → 孕期计算器 → 趣味小测试 */
{ k: 'qa', n: '孕期百问', d: '孕妈最常问的问题,一次看明白', c: '100 个问题', img: 'kepu', u: '人看过' },
{ k: 'js', n: '孕期计算器', d: '花多少钱、休几天产假,算一算', c: '14 个计算器', img: 'jisuan', u: '人算过' },
{ k: 'qz', n: '趣味小测试', d: '1 分钟测出你是哪种孕妈', c: '30 个测试', img: 'ceshi', u: '人测过' }
];
box.innerHTML = '<div class="kit-hd"><h2 class="kit-tt"><span>孕期百宝箱</span></h2><span class="kit-sl">查一查 · 算一算' + (window.__mbUgc ? ' · 测一测' : '') + '</span></div><div class="kit-pn"><div class="kit-g">' +
E.map(function (x) {
return '<button type="button" class="kit-e e-' + x.k + '" data-k="' + x.k + '"><img src="assets/img/kit/' + x.img + '.webp" alt="" decoding="async">' +
'<b>' + x.n + '</b><span>' + x.d + '</span><strong class="kit-n">' + FIRE + '<i>--</i>' + x.u + '</strong><em>' + x.c + '<i aria-hidden="true">›</i></em></button>';
}).join('') + '</div>' +
/* 11-03 用户:「『大家都在用』跟百宝箱像两块,割裂了」→ 去掉这个小标题和虚线,三个入口 + 6 条装进同一张白底面板(.kit-pn),一眼看出是百宝箱里的内容 */
'<div class="ms-list kit-list"></div></div>';
sec.classList.remove('hide');
function setCnt(k, t) { var e = box.querySelector('.e-' + k + ' em'); if (e) e.firstChild.nodeValue = t; }
function setNum(k, n) { var e = box.querySelector('.e-' + k + ' .kit-n i'); if (e && n) e.textContent = wanX(n); }
/* 人数口径(11-03 改):测过 = 30 个测试 gcTested 之和 × .456;看过 = 「此刻」总人数 × .574;算过 = CALC 全部计算器 heat 之和 × 总人数(同 topic/jisuan) */
function nums() {
/* 11-03 用户:「三个入口的人数太大,几十万就行,要有零有整」→ 系数压到几十万(测过 ≈68 万 / 看过 ≈87 万 / 算过 ≈50 万),且一律带一位小数(wanX)。
仍不小于下面列表里单条的最大值(单个测试 ≤12 万、单条百问 ≤64 万、单个计算器 ≤18 万),口径不打架。模拟数,12-31 复核 */
if (window.GC_TESTS_META && window.gcTested) { setNum('qz', window.GC_TESTS_META.reduce(function (a, x) { return a + window.gcTested(x.id); }, 0) * .456); setCnt('qz', window.GC_TESTS_META.length + ' 个测试'); }
setNum('qa', total() * .574);
setNum('js', total() * CALC.reduce(function (a, x) { return a + x.heat; }, 0));
if (QA && QA.length) setCnt('qa', QA.length + ' 个问题');
}
/* ---------- 下:4 条列表(11-04 由 6 条改 4 条:生娃计算器 + 测试 + 百问 + 计算器) ---------- */
/* 测试按孕周段分池(段同 app.js qaBand:1 ≤8 / 2 ≤13 / 3 ≤20 / 4 ≤28 / 5 ≤36 / 6 37+;0 = 没孕周 / 产后),每天轮换起点 */
var QZ_POOL = {
0: ['t11', 't14', 't13', 't16', 't18', 't23', 't03', 't22'],
1: ['t17', 't01', 't25', 't24', 't02', 't11'],
2: ['t17', 't01', 't25', 't24', 't02', 't11'],
3: ['t24', 't25', 't01', 't17', 't21', 't02'],
4: ['t24', 't21', 't25', 't01', 't02', 't17'],
5: ['t05', 't21', 't02', 't24', 't03', 't25'],
6: ['t05', 't03', 't02', 't06', 't21', 't25']
};
/* 计算器(同 topic/jisuan 列表;heat 也同那页) */
var CALC = [
{ q: '生娃到底要花多少钱?一键算清', h: 'topic/huafei/', heat: .118 },
{ q: '预产期是哪天?还有几天见面', h: 'topic/yuchanqi-js/', heat: .083, b: [1, 2, 0] }, /* 11-04 用户:孕期增重是记录工具不是计算器 → 换成新做的预产期计算器 */
{ q: '胎儿现在多重?填 B 超数估一估', h: '/taier-guzhong/', heat: .071, gate: 15, b: [4, 5] },
{ q: '产假能休多少天?哪天回去上班', h: 'topic/zhichang/', heat: .062, cm: 1, b: [4, 5, 6] }, /* cm:带 calc=1,进去第一屏就是计算器(11-03) */
/* 11-04 用户:「首页这 6 条也加上新的计算器」→ b = 适合的孕周段(同上 QZ_POOL 段号),第二条计算器从本段可用的里按天轮换 */
{ q: '今天孕几周几天?宝宝像什么', h: 'topic/yunzhou-js/', heat: .076, b: [1, 2, 3] },
{ q: '每次产检哪天去、查什么?', h: 'topic/chanjian-js/', heat: .069, b: [1, 2, 3, 4] },
{ q: '孕期胖多少才合适?', h: 'topic/zengzhong-js/', heat: .058, b: [2, 3, 4] },
{ q: '宝宝会是什么血型?', h: 'topic/xuexing-js/', heat: .066, b: [2, 3, 4] },
{ q: '宝宝长大能有多高?', h: 'topic/shengao-js/', heat: .079, b: [3, 4, 5] },
{ q: '坐月子要花多少钱?', h: 'topic/yuezi-js/', heat: .064, b: [4, 5, 6] },
{ q: '产假期间能领多少生育津贴?', h: 'topic/jintie-js/', heat: .072, b: [5, 6] },
{ q: '育儿补贴你家能领多少?', h: 'topic/butie-js/', heat: .081, b: [6, 0] },
{ q: '有宝宝一年能少交多少税?', h: 'topic/geshui-js/', heat: .047, b: [6, 0] },
{ q: '出生后哪些手续要在哪天前办?', h: 'topic/shouxu-js/', heat: .043, b: [6, 0] }
];
var QA = null, day = Math.floor((Date.now() + 288e5) / 864e5);
function band() { var p = window.__mbPreg || {}; return p.postpartum || !p.week ? 0 : (window.__mbQaBand ? window.__mbQaBand(p.week) : 0); }
function rows() {
var b = band(), p = window.__mbPreg || {}, wk = p.week && !p.postpartum ? p.week : 0, out = { qz: [], qa: [], js: [] };
var meta = window.GC_TESTS_META || [], pool = (QZ_POOL[b] || QZ_POOL[0]).map(function (id) { return meta.filter(function (x) { return x.id === id; })[0]; }).filter(Boolean);
for (var i = 0; i < Math.min(2, pool.length); i++) {
var t = pool[(day + i) % pool.length];
out.qz.push({ q: t.title, href: 'guangchang/ceshi/' + cleanQ({ id: t.id }), n: window.gcTested ? window.gcTested(t.id) : 0, u: '人测过' });
}
if (QA && QA.length) {
var skip = ['topic/huafei/', 'topic/ceshi/', 'topic/duiyou/', 'topic/zhichang/'];
var all = window.__mbQaPick ? window.__mbQaPick(QA, wk, 40) : QA;
all.filter(function (x) { return x.href && skip.indexOf(x.href) < 0; }).slice(0, 2).forEach(function (x) {
out.qa.push({ q: x.q, href: x.href + location.search + location.hash, n: window.__mbQaViews ? window.__mbQaViews(+x.heat || .03) : total() * (+x.heat || .03), u: '人看过' /* 11-03 同百问列表页口径 */ });
});
}
/* 11-04 用户:「生娃计算器放第一个,标个火」→ 计算器两条里 huafei 必在,排到 6 条最前(hot);
第二条从适合本孕周段(x.b)的计算器里按天轮换(11-04 加了 10 个新计算器) */
var hf = CALC[0], cp = CALC.filter(function (x) { return x !== hf && x.b && x.b.indexOf(b) >= 0 && !(x.gate && wk && wk < x.gate); });
if (!cp.length) cp = CALC.filter(function (x) { return x !== hf && !x.gate; });
var cl = [hf, cp[day % cp.length]];
cl.slice(0, 2).forEach(function (x) { out.js.push({ q: x.q, href: x.h + (x.cm ? (location.search ? location.search + '&' : '?') + 'calc=1' : location.search) + location.hash, n: total() * x.heat, u: '人算过' }); });
var r = [];
if (out.js[0]) r.push(Object.assign({ c: 'js', hot: 1 }, out.js[0]));
/* 11-04 用户:「百宝箱下面从 6 个改成 4 个」→ 生娃计算器(火)+ 测试 + 百问 + 第二个计算器,各类至少一条 */
/* 11-04 UGC 开关关着(js/ugc.js):不出测试,换成第二条百问,仍是 4 条 */
(window.__mbUgc ? [['qz', 0], ['qa', 0], ['js', 1]] : [['qa', 0], ['qa', 1], ['js', 1]]).forEach(function (p) { if (out[p[0]][p[1]]) r.push(Object.assign({ c: p[0] }, out[p[0]][p[1]])); });
return { r: r, wk: wk };
}
var TAG = { qz: '测试', qa: '百问', js: '计算器' };
var KR_GO = { qz: '去测', qa: '去看', js: '去算' };
/* 11-04 用户:「前面的小图标换成字:测试用『测』、百问用『问』、计算器用『算』」(KN_IC 线稿图标留着备用) */
var KR_CH = { qz: '测', qa: '问', js: '算' };
var KN_IC = {
qz: '<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M9 3h6M10 3v6l-5 9a2 2 0 001.8 3h10.4a2 2 0 001.8-3l-5-9V3" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>',
qa: '<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 5h16v11H9l-5 4z" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round"/><path d="M10 9.5a2 2 0 113 1.7c-.6.4-1 .8-1 1.5M12 14.5h.01" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/></svg>',
js: '<svg viewBox="0 0 24 24" aria-hidden="true"><rect x="5" y="3" width="14" height="18" rx="2.5" fill="none" stroke="currentColor" stroke-width="2"/><path d="M8.5 7h7M8.5 12h.01M12 12h.01M15.5 12h.01M8.5 16h.01M12 16h.01M15.5 16h.01" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"/></svg>'
};
function paint() {
nums();
var d = rows(), L = box.querySelector('.kit-list');
/* 11-03 用户:「这 6 条跟下面孕妈广场那 6 条太像,换个形式」→(便签墙试过,用户要回到一行一条的排列,只换样式)
一行一条,但不用名次数字和配图:左边按类型的彩色图标块(测试紫 / 百问绿 / 计算器橙),中间问题 + 类型·人数,右边 ›(11-03 用户嫌乱,样式收成一张白卡,见 kit.css)。 */
L.className = 'kit-list kit-rows';
/* 11-04 二改:「不用固定两个,6 条里随机 2~3 条在滚,一会儿换别的」→ 每条都备好静态行 + 滚动行(.kr-sw 叠放),
lvShuffle 每 5~7 秒随机定 2~3 条显示滚动(每次至少换 1 条),其余显示「类型 · 人数」 */
L.innerHTML = d.r.map(function (x) {
var lv = lvList(x);
return '<a class="kr ripple t-' + x.c + (x.hot ? ' hot' : '') + '" href="' + esc(x.href) + '"><span class="kr-ic kr-ch">' + KR_CH[x.c] +
(x.hot ? '<i class="kr-hot" aria-label="最热">' + FIRE + '</i>' : '') + '</span>' +
'<span class="kr-m"><span class="kr-q">' + esc(x.q) + '</span><span class="kr-sw"><span class="kr-n"><em>' + TAG[x.c] + '</em>' + FIRE + '<b>' + wan(x.n) + '</b>' + x.u + '</span>' + (lv ? lvHTML(lv) : '') + '</span></span>' +
'<span class="kr-go">' + KR_GO[x.c] + '</span></a>';
}).join('');
lvShuffle();
lvRun();
}
/* ---------- 6 条里随机 2 条:类型·人数 那一行换成「谁测出了什么 / 谁算出了多少」滚动 ----------
11-04 用户:「轮播别单独放底下,放到标题下面,替换『多少人测过』那行;谁谁谁测了、结果是什么;6 条里随机挑 2 条,其余照常显示」
→ 只从测试 / 计算器里挑(有结果可说),每次打开随机;测试结果取 meta.js GC_RES(tests.js 真实结果名),计算器结果是常见输入能算出的数。
昵称、头像均模拟(同「N 人测过」口径,AGENTS.md 12b,12-31 复核)。 */
/* 11-04 用户:「头像一定不要重复,同一个人不能同时在两条上滚,短时间内也别重复」→ 人不再写死在每一句上:
每句轮到显示时现挑一个人(lvWho):避开此刻正显示的人、也避开最近 16 次出现过的人;40 个人设(昵称 + 头像一一对应,头像互不重复)。 */
var LV_NM = ['小满妈妈', '糯米团子', '橙子不酸', '鹿鹿呀', '安安的妈', '豆包本包', '一只小葵', '阿圆', '栗子酱', '桃桃乌龙', '芝麻汤圆', '晴天娃娃',
'果冻布丁', '岁岁平安', '叮当妈', '饭团子', '奶糖不甜', '小鱼干', '朵朵妈咪', '暖暖', '布丁要长大', '花卷儿', '柚子茶', '星星的妈',
'甜甜圈', '小熊软糖', '一颗青梅', '冬冬妈', '可乐加冰', '麦穗儿', '云朵朵', '橘子汽水', '乐乐的妈', '荔枝', '蜜桃乌龙', '小葡萄',
'团团圆圆', '小雨点', '西瓜太甜', '慢慢来'];
var LV_AV = ['p02', 'm05', 'p05', 'm12', 'k04', 'p09', 'm16', 'p11', 'm07', 'k10', 'p03', 'm19', 'p13', 'm02', 'k06', 'p06', 'm10', 'p12', 'm21', 'p07', 'm04', 'k12', 'p14', 'm15',
'p01', 'm01', 'k01', 'm03', 'p04', 'm06', 'k02', 'm08', 'p08', 'm09', 'k03', 'm11', 'p10', 'm13', 'k05', 'm14'];
/* 11-05 用户:各模块头像不要重复(之前这 40 人和测试页「刚测出」是同一批)→ 改用分配表 kitLive 的 24 个人设(昵称 + 头像),只在这里出现 */
if (window.MB_AVA && MB_AVA.S.kitLive) { LV_NM = MB_AVA.S.kitLive.map(function (x) { return x[0]; }); LV_AV = MB_AVA.S.kitLive.map(function (x) { return x[1]; }); }
var LV_RECENT = [];
function lvWho(el) {
var on = {};
box.querySelectorAll('.kr.live .lv-i.on').forEach(function (x) { if (x !== el && x.dataset.w) on[x.dataset.w] = 1; });
var c = [], k;
for (k = 0; k < LV_NM.length; k++) if (!on[k] && LV_RECENT.indexOf(k) < 0) c.push(k);
if (!c.length) for (k = 0; k < LV_NM.length; k++) if (!on[k]) c.push(k);
var j = c[Math.floor(Math.random() * c.length)];
LV_RECENT.push(j); if (LV_RECENT.length > 16) LV_RECENT.shift();
el.dataset.w = j;
el.querySelector('img').src = /:|^\//.test(LV_AV[j]) && window.MB_AVA ? MB_AVA.src(LV_AV[j], '') : 'assets/img/mom/' + LV_AV[j] + '.jpg';
el.querySelector('em').textContent = LV_NM[j];
}
var LV_JS = {
'topic/huafei/': ['算出养到 18 岁约 <b>62.8 万</b>', '算出头一年约 <b>9.6 万</b>', '算出养到 3 岁约 <b>21.4 万</b>', '算出养到 18 岁约 <b>48.5 万</b>'],
'topic/yuchanqi-js/': ['算出还有 <b>96 天</b>见面', '算出现在孕 <b>23 周 + 4 天</b>', '算出预产期在 <b>3 月 12 日</b>', '算出预产期在 <b>4 月 20 日</b>'],
'/taier-guzhong/': ['估出宝宝约 <b>1.6 斤</b>', '估出宝宝约 <b>2.3 斤</b>', '估出宝宝约 <b>3.1 斤</b>'],
'topic/yunzhou-js/': ['算出今天孕 <b>18 周 + 2 天</b>', '算出现在 <b>孕 5 月</b>', '算出宝宝像 <b>一个芒果</b>'],
'topic/chanjian-js/': ['排出下次产检在 <b>12 月 3 日</b>', '排出糖耐在 <b>1 月 8 日</b>前做'],
'topic/zengzhong-js/': ['算出孕期胖 <b>8~14 公斤</b>合适', '算出现在胖得 <b>刚好</b>'],
'topic/xuexing-js/': ['算出宝宝 <b>59%</b> 是 A 型', '算出宝宝可能是 <b>O 型或 B 型</b>'],
'topic/shengao-js/': ['算出宝宝约 <b>175 cm</b>', '算出女儿约 <b>162 cm</b>'],
'topic/yuezi-js/': ['算出月子中心约 <b>4 万</b>', '算出请月嫂约 <b>1.6 万</b>'],
'topic/jintie-js/': ['算出生育津贴约 <b>4.7 万</b>', '算出津贴约 <b>3.2 万</b>'],
'topic/butie-js/': ['算出能领 <b>10800 元</b>', '算出两个孩子领 <b>1.6 万</b>'],
'topic/geshui-js/': ['算出一年少交 <b>2400 元</b>税', '算出一年少交 <b>4800 元</b>税'],
'topic/shouxu-js/': ['排好 <b>11 件</b>出生手续', '查到上户口还剩 <b>6 天</b>'],
'topic/zhichang/': ['算出产假能休 <b>178 天</b>(广东)', '算出产假能休 <b>158 天</b>(上海)', '算出产假能休 <b>188 天</b>(河南)', '算出产假能休 <b>180 天</b>(吉林)']
};
var lvT = 0;
function lvList(x) {
if (x.c === 'qz') {
var id = (x.href.match(/[?&]id=(t\d+)/) || [])[1], r = (window.GC_RES || {})[id];
return r && r.length ? r.map(function (t) { return '测出「' + esc(t) + '」'; }) : null;
}
/* 11-04 用户:「转给了老公」我们识别不到、是凭空编的 → 只写站内本来就有的动作(看、收藏、转发),不写对象 */
if (x.c === 'qa') return ['刚看完这条', '正在看', '收藏了这条', '转发了这条'];
var k = Object.keys(LV_JS).filter(function (h) { return x.href.indexOf(h) === 0; })[0];
return k ? LV_JS[k] : null;
}
function lvHTML(l) {
return '<span class="kr-lv">' + l.map(function (t, i) {
return '<span class="lv-i' + (i ? '' : ' on') + '"><img alt="" width="16" height="16"><em></em>' + t + '</span>';
}).join('') + '</span>';
}
var lvS = 0, LV_ON = [];
function lvShuffle() {
var rs = [].slice.call(box.querySelectorAll('.kit-rows .kr')).filter(function (r) { return r.querySelector('.kr-lv'); });
if (!rs.length) return;
var n = Math.min(rs.length, Math.random() < .5 ? 1 : 2), nx, t = 0; /* 11-04 用户:同时滚动 2~3 条 → 1~2 条,不超过 2 */
/* 11-04 用户:「生娃到底要花多少钱」那条(.hot)尽量多轮播,约 70% 的轮次都有它;其余名额从另外几条里随机挑 */
var hi = -1; rs.forEach(function (r, i) { if (r.classList.contains('hot')) hi = i; });
var withHot = hi >= 0 && Math.random() < .7;
do { /* 和上一轮完全一样就重挑(只有「生娃」一条时允许连着出,它自己的内容每 3 秒在换) */
var rest = rs.map(function (r, i) { return i; }).filter(function (i) { return i !== hi; }).sort(function () { return Math.random() - .5; });
nx = (withHot ? [hi].concat(rest.slice(0, n - 1)) : rest.slice(0, n)).sort();
} while (nx.join() === LV_ON.join() && !(withHot && n === 1) && ++t < 9);
LV_ON = nx;
rs.forEach(function (r, i) {
var go = LV_ON.indexOf(i) >= 0;
if (go && !r.classList.contains('live')) { r.classList.add('live'); var e = r.querySelector('.lv-i.on'); if (e) lvWho(e); }
else if (!go) r.classList.remove('live');
});
clearTimeout(lvS);
lvS = setTimeout(lvShuffle, 5000 + Math.random() * 2000);
}
function lvRun() {
clearInterval(lvT);
lvT = setInterval(function () {
if (document.hidden) return;
box.querySelectorAll('.kr-lv').forEach(function (w) {
var a = w.querySelector('.lv-i.on'), b = (a && a.nextElementSibling) || w.firstElementChild;
if (!a || a === b || !w.closest('.kr.live')) return;
a.classList.remove('on'); a.classList.add('up'); setTimeout(function () { a.classList.remove('up'); }, 450);
lvWho(b); b.classList.add('on');
});
}, 3000);
}
fetch('assets/data/qa/hot.json?v=' + V).then(function (r) { return r.ok ? r.json() : []; }).catch(function () { return []; })
.then(function (a) { QA = Array.isArray(a) ? a : []; paint(); });
if (!window.gcTested) { var ms = document.createElement('script'); ms.src = 'guangchang/ceshi/meta.js?v=' + V; ms.onload = paint; document.body.appendChild(ms); }
window.addEventListener('mb-preg', paint);
window.addEventListener('mb-ugc', function () { var sl = box.querySelector('.kit-sl'); if (sl) sl.textContent = '查一查 · 算一算' + (window.__mbUgc ? ' · 测一测' : ''); paint(); });
setTimeout(paint, 3000); /* 「此刻」总人数接口晚到时按后台配置的人数重算一次 */
paint();
box.addEventListener('click', function (e) {
var b = e.target.closest('.kit-e'); if (!b) return;
try { navigator.vibrate && navigator.vibrate(8); } catch (x) {}
var k = b.dataset.k;
if (k === 'qz') location.href = 'guangchang/' + cleanQ({ c: 'ceshi' });
else if (k === 'js') location.href = 'topic/jisuan/' + cleanQ();
else if (window.__mbOpenQA) window.__mbOpenQA('孕期百问');
});
})();