Files
mama-box/js/kit.js
deploy 3fc780e42c v26110602 孕期计算器新增 5 个:满月百天周岁、纸尿裤囤多少、奶粉一罐吃几天、双眼皮酒窝、教育金每月存多少
- topic/{rizi,niaobu,naifen,yichuan,jiaoyujin}-js 分步模式页面 + 转发图
- 计算器列表页、首页百宝箱登记,计数 14→19
- AGENTS.md 12b 补登记新计算器的模拟人数

Co-Authored-By: AI 助手 <noreply@local>
2026-11-06 02:20:28 +00:00

272 lines
24 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 = '26110464';
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 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>'
};
var E = [
/* 11-04 用户:三个入口顺序改为 孕期百问 → 孕期计算器 → 趣味小测试 */
{ k: 'qa', n: '孕期百问', d: '孕妈最常问的问题,一次看明白', c: '100 个问题', img: 'kepu', u: '人看过' },
{ k: 'js', n: '孕期计算器', d: '花多少钱、休几天产假,算一算', c: '19 个计算器', 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>' +
/* 11-05 用户:「大家不知道三个按钮能点,看完 6 条以为有『查看更多』,可又没有综合页」→ 列表底部加一排「查看更多」,
按类型分三颗胶囊直达三个列表页(颜色、图标和上面三张卡一一对应),上面三张卡的按钮加一道定时扫光提示可点 */
'<div class="kit-mo"><span>查看更多</span>' + E.map(function (x) {
return '<button type="button" class="kit-mb m-' + x.k + '" data-k="' + x.k + '">' + KN_IC[x.k] + x.n.replace(/^孕期|^趣味小/, '') + '<i aria-hidden="true">›</i></button>';
}).join('') + '</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] },
/* 11-06 新增 5 个(同 topic/jisuan) */
{ q: '满月、百天、周岁是哪天?', h: 'topic/rizi-js/', heat: .061, b: [5, 6, 0] },
{ q: '纸尿裤要囤多少?每个码几包', h: 'topic/niaobu-js/', heat: .052, b: [5, 6, 0] },
{ q: '奶粉一罐能吃几天?一年花多少', h: 'topic/naifen-js/', heat: .048, b: [6, 0] },
{ q: '宝宝会不会有双眼皮、酒窝?', h: 'topic/yichuan-js/', heat: .057, b: [2, 3, 4] },
{ q: '教育金每月存多少才够?', h: 'topic/jiaoyujin-js/', heat: .039, b: [6, 0] }
];
var QA_FIX = 'topic/yingyang/';
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) {
/* 11-05 用户:6 条的第 5 个固定放孕期百问「孕期营养影响孩子智商吗?」(topic/yingyang/)→ 单独取出,别的百问位不再挑它 */
var fx = QA.filter(function (x) { return x.href === QA_FIX; })[0];
if (fx) out.fix = { q: fx.q, href: fx.href + location.search + location.hash, n: window.__mbQaViews ? window.__mbQaViews(+fx.heat || .03) : total() * (+fx.heat || .03), u: '人看过' };
var skip = ['topic/huafei/', 'topic/ceshi/', 'topic/duiyou/', 'topic/zhichang/', QA_FIX];
var all = window.__mbQaPick ? window.__mbQaPick(QA, wk, 40) : QA;
all.filter(function (x) { return x.href && skip.indexOf(x.href) < 0; }).slice(0, 4).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 条 */
/* 11-05 用户:「孕期百宝箱里调出 6 篇」→ 回到 6 条:火 + 测试2 + 百问2 + 计算器;UGC 关着时测试换百问(百问最多取 4 条) */
(window.__mbUgc ? [['qz', 0], ['qa', 0], ['js', 1], ['fix'], ['qa', 1]] : [['qa', 0], ['qa', 1], ['js', 1], ['fix'], ['qa', 2]]).forEach(function (p) {
var x = p[0] === 'fix' ? out.fix : out[p[0]][p[1]]; if (x) r.push(Object.assign({ c: p[0] === 'fix' ? 'qa' : p[0] }, x));
});
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: '算' };
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/rizi-js/': ['算出百天是 <b>3 月 20 日</b>', '算出满月是 <b>农历腊月初八</b>', '算出周岁宴定在 <b>周六</b>'],
'topic/niaobu-js/': ['算出 S 码要囤 <b>12 包</b>', '算出头一年约 <b>1900 片</b>'],
'topic/naifen-js/': ['算出一罐能吃 <b>7 天</b>', '算出第一年奶粉约 <b>1.4 万</b>'],
'topic/yichuan-js/': ['算出宝宝 <b>83%</b> 是双眼皮', '算出宝宝 <b>更像妈妈</b>一点'],
'topic/jiaoyujin-js/': ['算出每月存 <b>1180 元</b>就够', '算出到 18 岁攒够 <b>30 万</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;
/* 11-05 用户:「四个文章第一个一直保持滚动,其他三个随机选一个滚动」→ 第 1 条(生娃计算器)常驻滚动;
其余几条(11-05 起 6 条 → 后 5 条)里每 5~7 秒随机换一条滚(和上一轮不同),同时最多 2 条在滚 */
var first = rs[0] === box.querySelector('.kit-rows .kr') ? 0 : -1;
var rest = rs.map(function (r, i) { return i; }).filter(function (i) { return i !== first; });
var prev = LV_ON.filter(function (i) { return i !== first; })[0], c = rest.filter(function (i) { return i !== prev; });
if (!c.length) c = rest;
var nx = (first === 0 ? [0] : []).concat(c.length ? [c[Math.floor(Math.random() * c.length)]] : []).sort();
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,.kit-mb'); 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('孕期百问');
});
})();