v26110253 测试类页面记住最后停留的页面(开始/答题第几题/结果):生娃计算器、5 个专题测试、广场测一测

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
deploy
2026-11-03 06:21:55 +00:00
parent 5d8335a9d5
commit 0f79ddcffb
14 changed files with 135 additions and 30 deletions

View File

@@ -367,8 +367,8 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
</div>
<div class="toast" id="toast"></div>
<script src="meta.js?v=26110252"></script>
<script src="tests.js?v=26110252"></script>
<script src="meta.js?v=26110253"></script>
<script src="tests.js?v=26110253"></script>
<script>
(function () {
'use strict';
@@ -413,7 +413,15 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
var n = 0;
es.forEach(function (e) { if (!e.isIntersecting) return; var el = e.target; io.unobserve(el); setTimeout(function () { el.classList.add('in'); }, 60 * n++); });
}, { root: sc, threshold: .08 }) : null;
/* 11-03 用户:「重新测试后退回首页,再进来还是结果页;应该以最后所在的页面,再进来呈现对应的页面」
→ 每个测试记住最后停在哪(开始 / 第几题 / 结果),按 openid + 测试 id 存 mmbox.gcts.pos.v1,再进来回到那里 */
var PKEY = 'mmbox.gcts.pos.v1';
function pos(v) {
if (v) pos.v = v;
try { var o = JSON.parse(localStorage.getItem(PKEY) || '{}'); o[UID] = o[UID] || {}; o[UID][t.id] = { v: pos.v, cur: cur, ans: ans }; localStorage.setItem(PKEY, JSON.stringify(o)); } catch (e) {}
}
function show(name) {
pos(name);
Object.keys(views).forEach(function (k) { views[k].classList.toggle('on', k === name); });
sc.scrollTop = 0;
[].forEach.call(views[name].querySelectorAll('.fade'), function (el) { el.classList.remove('in'); if (io) { io.unobserve(el); io.observe(el); } else el.classList.add('in'); });
@@ -472,6 +480,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
$('#prevBtn').disabled = cur === 0;
if (isQuiz) { var k = $('#qOk'); k.hidden = !ans.length; k.textContent = '答对 ' + okCount(); }
if (ans[cur] != null) mark(ans[cur], true);
if (pos.v === 'quiz') pos();
}
function mark(i, replay) {
var bs = $('#qOpts').querySelectorAll('.opt');
@@ -513,7 +522,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
/* ================= ③ 计分 ================= */
function band(v) { var r = R[0]; R.forEach(function (x) { if (x.min != null && v >= x.min) r = x; }); return r; }
var res = null;
function finish() {
function finish(old) { /* old = 上次的记录:回到结果页时按存下的答案重算、不重新落记录 */
var qs = t.questions;
if (isQuiz) {
var ok = okCount(); res = { r: band(ok), v: ok, p: ok / N, score: ok + '/' + N };
@@ -531,8 +540,8 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
var pc = {}, rest = 100; R.forEach(function (r) { pc[r.k] = Math.round(cnt[r.k] / N * 100); rest -= pc[r.k]; }); pc[tied[0].k] += rest;
res = { r: tied[0], cnt: cnt, pc: pc, score: '' };
}
res.ans = ans.slice(); res.at = Date.now();
saveRec({ title: res.r.title, score: res.score, at: res.at });
res.ans = ans.slice(); res.at = old ? old.at : Date.now();
if (!old) saveRec({ title: res.r.title, score: res.score, at: res.at, ans: res.ans });
renderResult();
}
@@ -713,7 +722,14 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
}, { passive: false });
document.addEventListener('touchmove', function (e) { if (!sc.contains(e.target) && !$('#mask').contains(e.target) && e.cancelable) e.preventDefault(); }, { passive: false });
renderStart(); show('start');
renderStart();
(function () {
var p = null, rec = store()[t.id];
try { p = ((JSON.parse(localStorage.getItem(PKEY) || '{}'))[UID] || {})[t.id]; } catch (e) {}
if (p && p.v === 'quiz' && Array.isArray(p.ans)) { cur = Math.max(0, Math.min(+p.cur || 0, N - 1)); ans = p.ans.slice(0, N); paint(); show('quiz'); return; }
if (p && p.v === 'result' && rec && Array.isArray(rec.ans) && rec.ans.length === N) { ans = rec.ans.slice(); finish(rec); return; }
show('start'); /* 新进来 / 上次停在开始页 / 旧记录没存答案 */
})();
})();
</script>
</body>