v26110253 测试类页面记住最后停留的页面(开始/答题第几题/结果):生娃计算器、5 个专题测试、广场测一测
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -68,7 +68,7 @@
|
||||
function getJSON(u) { return fetch(u, { cache: 'no-cache' }).then(function (r) { if (!r.ok) throw r.status; return r.json(); }); }
|
||||
|
||||
function related(box) {
|
||||
getJSON('../_shared/idx.json?v=26110252').then(function (idx) {
|
||||
getJSON('../_shared/idx.json?v=26110253').then(function (idx) {
|
||||
var me = null; idx.forEach(function (x) { if (x[0] === SLUG) me = x; });
|
||||
var tag = me ? me[2] : '', h = 0; for (var i = 0; i < SLUG.length; i++) h = (h * 31 + SLUG.charCodeAt(i)) >>> 0;
|
||||
var rest = idx.filter(function (x) { return x[0] !== SLUG; });
|
||||
@@ -175,7 +175,7 @@
|
||||
}
|
||||
fetch(API + '/comments?kind=topic&target=' + encodeURIComponent(SLUG) + (OID ? '&openid=' + encodeURIComponent(OID) : ''))
|
||||
.then(function (r) { return r.json(); }).then(function (j) { if (j && j.code === 200) { RC = j.result; paint(); } }).catch(function () {});
|
||||
getJSON('../_shared/cm/' + SLUG + '.json?v=26110252').then(function (d) { L = d.c || []; paint(); }).catch(function () { paint(); });
|
||||
getJSON('../_shared/cm/' + SLUG + '.json?v=26110253').then(function (d) { L = d.c || []; paint(); }).catch(function () { paint(); });
|
||||
}
|
||||
|
||||
function extras(el) {
|
||||
|
||||
@@ -442,7 +442,20 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
||||
setTimeout(function () { el.classList.add('in'); }, 60 * n++);
|
||||
});
|
||||
}, { root: sc, threshold: .08 }) : null;
|
||||
/* 11-03 用户:「重新测试后退回首页,再进来还是结果页」→ 记住最后停在哪(开始 / 第几题 / 结果),再进来回到那里 */
|
||||
function pos(v) {
|
||||
if (v) pos.v = v;
|
||||
try { localStorage.setItem(KEY + '.pos', JSON.stringify({ v: pos.v, cur: cur, ans: ans })); } catch (e) {}
|
||||
}
|
||||
function resume() {
|
||||
var p = null; try { p = JSON.parse(localStorage.getItem(KEY + '.pos') || 'null'); } catch (e) {}
|
||||
if (!p) return false; /* 旧用户没有记录:照原来的(有结果看结果) */
|
||||
if (p.v === 'start') { show('start'); return true; }
|
||||
if (p.v === 'quiz' && Array.isArray(p.ans)) { cur = Math.max(0, Math.min(+p.cur || 0, QS.length - 1)); ans = p.ans.slice(0, QS.length); paint(); show('quiz'); return true; }
|
||||
return false;
|
||||
}
|
||||
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) {
|
||||
@@ -469,6 +482,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
||||
'</span><span class="ck"><svg class="ic"><use href="#i-check" xlink:href="#i-check"/></svg></span></button>';
|
||||
}).join('');
|
||||
$('#prevBtn').disabled = cur === 0;
|
||||
if (pos.v === 'quiz') pos();
|
||||
}
|
||||
|
||||
/* 左右滑动:前进 → 当前向左滑出、新题从右滑入;上一题反过来 */
|
||||
@@ -760,7 +774,8 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
||||
/* 入口:有上次结果直接看结果,否则开始页 */
|
||||
var saved = null;
|
||||
try { saved = JSON.parse(localStorage.getItem(KEY) || 'null'); } catch (e) {}
|
||||
if (saved && TYPES[saved.type] && saved.scores && saved.ans && saved.ans.length === QS.length) render(saved, true);
|
||||
if (resume()) ;
|
||||
else if (saved && TYPES[saved.type] && saved.scores && saved.ans && saved.ans.length === QS.length) render(saved, true);
|
||||
else show('start');
|
||||
|
||||
/* 禁止下拉回弹:固定外壳 + 容器滚动 + 到顶/到底时拦 touchmove */
|
||||
|
||||
@@ -448,7 +448,20 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
||||
setTimeout(function () { el.classList.add('in'); }, 60 * n++);
|
||||
});
|
||||
}, { root: sc, threshold: .08 }) : null;
|
||||
/* 11-03 用户:「重新测试后退回首页,再进来还是结果页」→ 记住最后停在哪(开始 / 第几题 / 结果),再进来回到那里 */
|
||||
function pos(v) {
|
||||
if (v) pos.v = v;
|
||||
try { localStorage.setItem(KEY + '.pos', JSON.stringify({ v: pos.v, cur: cur, ans: ans })); } catch (e) {}
|
||||
}
|
||||
function resume() {
|
||||
var p = null; try { p = JSON.parse(localStorage.getItem(KEY + '.pos') || 'null'); } catch (e) {}
|
||||
if (!p) return false; /* 旧用户没有记录:照原来的(有结果看结果) */
|
||||
if (p.v === 'start') { show('start'); return true; }
|
||||
if (p.v === 'quiz' && Array.isArray(p.ans)) { cur = Math.max(0, Math.min(+p.cur || 0, QS.length - 1)); ans = p.ans.slice(0, QS.length); paint(); show('quiz'); return true; }
|
||||
return false;
|
||||
}
|
||||
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) {
|
||||
@@ -475,6 +488,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
||||
'</span><span class="ck"><svg class="ic"><use href="#i-check" xlink:href="#i-check"/></svg></span></button>';
|
||||
}).join('');
|
||||
$('#prevBtn').disabled = cur === 0;
|
||||
if (pos.v === 'quiz') pos();
|
||||
}
|
||||
|
||||
/* 左右滑动:前进 → 当前向左滑出、新题从右滑入;上一题反过来 */
|
||||
@@ -744,7 +758,8 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
||||
/* 入口:有上次结果直接看结果,否则开始页 */
|
||||
var saved = null;
|
||||
try { saved = JSON.parse(localStorage.getItem(KEY) || 'null'); } catch (e) {}
|
||||
if (saved && TYPES[saved.type] && saved.scores && saved.ans && saved.ans.length === QS.length) render(saved, true);
|
||||
if (resume()) ;
|
||||
else if (saved && TYPES[saved.type] && saved.scores && saved.ans && saved.ans.length === QS.length) render(saved, true);
|
||||
else show('start');
|
||||
|
||||
/* 禁止下拉回弹:固定外壳 + 容器滚动 + 到顶/到底时拦 touchmove */
|
||||
|
||||
@@ -749,7 +749,11 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
|
||||
}
|
||||
|
||||
/* ================= 屏切换 ================= */
|
||||
/* 11-03 用户:「点重新测试回到开始页,退回首页再进来,显示的还是账单」→ 记住最后停在哪一屏(开始 / 第几题 / 账单),再进来回到那一屏 */
|
||||
var scr = 'sStart', booting = true;
|
||||
function show(id) {
|
||||
scr = id;
|
||||
if (!booting) save();
|
||||
[].forEach.call(document.querySelectorAll('.screen'), function (el) { el.classList.toggle('on', el.id === id); });
|
||||
$('#bgTop').style.display = id === 'sQ' ? 'none' : '';
|
||||
sc.scrollTop = 0;
|
||||
@@ -1235,15 +1239,21 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
|
||||
});
|
||||
}
|
||||
|
||||
$('#reTest').addEventListener('click', function () { route = -1; A = {}; cur = 0; renderStart(); show('sStart'); });
|
||||
/* 重新测试 = 这份账单作废:清掉「看上次的账单」,存成停在开始页 */
|
||||
$('#reTest').addEventListener('click', function () { route = -1; A = {}; cur = 0; hasBill = false; billNo = ''; billAt = ''; renderStart(); show('sStart'); });
|
||||
|
||||
/* ================= 存取(v5;兼容读取 v4:路线 + 6 题答案,阶段按全部、收入为空) ================= */
|
||||
function save() {
|
||||
try { localStorage.setItem(KEY, JSON.stringify({ route: route, rid: ROUTES[route].id, a: A, done: hasBill, no: billNo, at: billAt })); } catch (e) {}
|
||||
try {
|
||||
localStorage.setItem(KEY, JSON.stringify(route < 0 ? { scr: 'sStart', done: false } /* 没选路线(重新测试后):只记停在开始页 */
|
||||
: { route: route, rid: ROUTES[route].id, a: A, done: hasBill, no: billNo, at: billAt, scr: scr, cur: cur }));
|
||||
} catch (e) {}
|
||||
}
|
||||
var lastScr = '', lastCur = 0;
|
||||
function load() {
|
||||
try {
|
||||
var o = JSON.parse(localStorage.getItem(KEY) || 'null') || JSON.parse(localStorage.getItem(KEY4) || 'null');
|
||||
if (o) { lastScr = o.scr || ''; lastCur = +o.cur || 0; }
|
||||
if (o && !o.rid && o.route >= 0) o.rid = ['rich', 'mid', 'low'][o.route]; /* 旧记录是旧顺序(富豪在前),按 id 换算 */
|
||||
var ri = o ? ROUTES.map(function (x) { return x.id; }).indexOf(o.rid) : -1;
|
||||
if (ri < 0) return false;
|
||||
@@ -1263,7 +1273,11 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
|
||||
|
||||
hasBill = load();
|
||||
renderStart();
|
||||
if (hasBill) renderRes(false); else show('sStart');
|
||||
/* 回到上次停的那一屏;旧记录没有 scr:有账单就看账单(原行为) */
|
||||
if (lastScr === 'sQ' && route >= 0) { cur = Math.max(0, Math.min(lastCur, flow().length - 1)); renderQ(); }
|
||||
else if (lastScr === 'sStart' || !hasBill) show('sStart');
|
||||
else renderRes(false);
|
||||
booting = false;
|
||||
|
||||
/* 返回:从首页点进来就 back;直接打开(分享 / 刷新)就回同目录的首页,身份原样带回 */
|
||||
$('#back').addEventListener('click', function () {
|
||||
|
||||
@@ -482,7 +482,20 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
||||
setTimeout(function () { el.classList.add('in'); }, 60 * n++);
|
||||
});
|
||||
}, { root: sc, threshold: .08 }) : null;
|
||||
/* 11-03 用户:「重新测试后退回首页,再进来还是结果页」→ 记住最后停在哪(开始 / 第几题 / 结果),再进来回到那里 */
|
||||
function pos(v) {
|
||||
if (v) pos.v = v;
|
||||
try { localStorage.setItem(KEY + '.pos', JSON.stringify({ v: pos.v, cur: cur, ans: ans })); } catch (e) {}
|
||||
}
|
||||
function resume() {
|
||||
var p = null; try { p = JSON.parse(localStorage.getItem(KEY + '.pos') || 'null'); } catch (e) {}
|
||||
if (!p) return false; /* 旧用户没有记录:照原来的(有结果看结果) */
|
||||
if (p.v === 'start') { show('start'); return true; }
|
||||
if (p.v === 'quiz' && Array.isArray(p.ans)) { cur = Math.max(0, Math.min(+p.cur || 0, QS.length - 1)); ans = p.ans.slice(0, QS.length); paint(); show('quiz'); return true; }
|
||||
return false;
|
||||
}
|
||||
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) {
|
||||
@@ -509,6 +522,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
||||
'</span><span class="ck"><svg class="ic"><use href="#i-check" xlink:href="#i-check"/></svg></span></button>';
|
||||
}).join('');
|
||||
$('#prevBtn').disabled = cur === 0;
|
||||
if (pos.v === 'quiz') pos();
|
||||
}
|
||||
|
||||
/* 左右滑动:前进 → 当前向左滑出、新题从右滑入;上一题反过来 */
|
||||
@@ -772,7 +786,8 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
||||
/* 入口:有上次结果直接看结果,否则开始页 */
|
||||
var saved = null;
|
||||
try { saved = JSON.parse(localStorage.getItem(KEY) || 'null'); } catch (e) {}
|
||||
if (saved && saved.cats && saved.ans && saved.ans.length === QS.length && typeof saved.score === 'number') render(saved, true);
|
||||
if (resume()) ;
|
||||
else if (saved && saved.cats && saved.ans && saved.ans.length === QS.length && typeof saved.score === 'number') render(saved, true);
|
||||
else show('start');
|
||||
|
||||
/* 禁止下拉回弹:固定外壳 + 容器滚动 + 到顶/到底时拦 touchmove */
|
||||
|
||||
@@ -480,7 +480,20 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
||||
setTimeout(function () { el.classList.add('in'); }, 60 * n++);
|
||||
});
|
||||
}, { root: sc, threshold: .08 }) : null;
|
||||
/* 11-03 用户:「重新测试后退回首页,再进来还是结果页」→ 记住最后停在哪(开始 / 第几题 / 结果),再进来回到那里 */
|
||||
function pos(v) {
|
||||
if (v) pos.v = v;
|
||||
try { localStorage.setItem(KEY + '.pos', JSON.stringify({ v: pos.v, cur: cur, ans: ans })); } catch (e) {}
|
||||
}
|
||||
function resume() {
|
||||
var p = null; try { p = JSON.parse(localStorage.getItem(KEY + '.pos') || 'null'); } catch (e) {}
|
||||
if (!p) return false; /* 旧用户没有记录:照原来的(有结果看结果) */
|
||||
if (p.v === 'start') { show('start'); return true; }
|
||||
if (p.v === 'quiz' && Array.isArray(p.ans)) { cur = Math.max(0, Math.min(+p.cur || 0, QS.length - 1)); ans = p.ans.slice(0, QS.length); paint(); show('quiz'); return true; }
|
||||
return false;
|
||||
}
|
||||
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) {
|
||||
@@ -507,6 +520,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
||||
'</span><span class="ck"><svg class="ic"><use href="#i-check" xlink:href="#i-check"/></svg></span></button>';
|
||||
}).join('');
|
||||
$('#prevBtn').disabled = cur === 0;
|
||||
if (pos.v === 'quiz') pos();
|
||||
}
|
||||
|
||||
/* 左右滑动:前进 → 当前向左滑出、新题从右滑入;上一题反过来 */
|
||||
@@ -762,7 +776,8 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
||||
var saved = null;
|
||||
try { saved = JSON.parse(localStorage.getItem(KEY) || 'null'); } catch (e) {}
|
||||
var valid = saved && saved.ans && saved.ans.length === QS.length && saved.ans.every(function (i, qi) { return QS[qi].o[i]; });
|
||||
if (valid) render(saved, true);
|
||||
if (resume()) ;
|
||||
else if (valid) render(saved, true);
|
||||
else show('start');
|
||||
|
||||
/* 禁止下拉回弹:固定外壳 + 容器滚动 + 到顶/到底时拦 touchmove */
|
||||
|
||||
@@ -477,7 +477,20 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
||||
setTimeout(function () { el.classList.add('in'); }, 60 * n++);
|
||||
});
|
||||
}, { root: sc, threshold: .08 }) : null;
|
||||
/* 11-03 用户:「重新测试后退回首页,再进来还是结果页」→ 记住最后停在哪(开始 / 第几题 / 结果),再进来回到那里 */
|
||||
function pos(v) {
|
||||
if (v) pos.v = v;
|
||||
try { localStorage.setItem(KEY + '.pos', JSON.stringify({ v: pos.v, cur: cur, ans: ans })); } catch (e) {}
|
||||
}
|
||||
function resume() {
|
||||
var p = null; try { p = JSON.parse(localStorage.getItem(KEY + '.pos') || 'null'); } catch (e) {}
|
||||
if (!p) return false; /* 旧用户没有记录:照原来的(有结果看结果) */
|
||||
if (p.v === 'start') { show('start'); return true; }
|
||||
if (p.v === 'quiz' && Array.isArray(p.ans)) { cur = Math.max(0, Math.min(+p.cur || 0, QS.length - 1)); ans = p.ans.slice(0, QS.length); paint(); show('quiz'); return true; }
|
||||
return false;
|
||||
}
|
||||
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) {
|
||||
@@ -504,6 +517,7 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
||||
'</span><span class="ck"><svg class="ic"><use href="#i-check" xlink:href="#i-check"/></svg></span></button>';
|
||||
}).join('');
|
||||
$('#prevBtn').disabled = cur === 0;
|
||||
if (pos.v === 'quiz') pos();
|
||||
}
|
||||
|
||||
/* 左右滑动:前进 → 当前向左滑出、新题从右滑入;上一题反过来 */
|
||||
@@ -759,7 +773,8 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
||||
/* 入口:有上次结果直接看结果,否则开始页 */
|
||||
var saved = null;
|
||||
try { saved = JSON.parse(localStorage.getItem(KEY) || 'null'); } catch (e) {}
|
||||
if (saved && saved.ans && saved.ans.length === QS.length && typeof saved.score === 'number') render(saved, true);
|
||||
if (resume()) ;
|
||||
else if (saved && saved.ans && saved.ans.length === QS.length && typeof saved.score === 'number') render(saved, true);
|
||||
else show('start');
|
||||
|
||||
/* 禁止下拉回弹:固定外壳 + 容器滚动 + 到顶/到底时拦 touchmove */
|
||||
|
||||
Reference in New Issue
Block a user