v26110253 测试类页面记住最后停留的页面(开始/答题第几题/结果):生娃计算器、5 个专题测试、广场测一测
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -367,8 +367,8 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
|||||||
</div>
|
</div>
|
||||||
<div class="toast" id="toast"></div>
|
<div class="toast" id="toast"></div>
|
||||||
|
|
||||||
<script src="meta.js?v=26110252"></script>
|
<script src="meta.js?v=26110253"></script>
|
||||||
<script src="tests.js?v=26110252"></script>
|
<script src="tests.js?v=26110253"></script>
|
||||||
<script>
|
<script>
|
||||||
(function () {
|
(function () {
|
||||||
'use strict';
|
'use strict';
|
||||||
@@ -413,7 +413,15 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
|||||||
var n = 0;
|
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++); });
|
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;
|
}, { 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) {
|
function show(name) {
|
||||||
|
pos(name);
|
||||||
Object.keys(views).forEach(function (k) { views[k].classList.toggle('on', k === name); });
|
Object.keys(views).forEach(function (k) { views[k].classList.toggle('on', k === name); });
|
||||||
sc.scrollTop = 0;
|
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'); });
|
[].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;
|
$('#prevBtn').disabled = cur === 0;
|
||||||
if (isQuiz) { var k = $('#qOk'); k.hidden = !ans.length; k.textContent = '答对 ' + okCount(); }
|
if (isQuiz) { var k = $('#qOk'); k.hidden = !ans.length; k.textContent = '答对 ' + okCount(); }
|
||||||
if (ans[cur] != null) mark(ans[cur], true);
|
if (ans[cur] != null) mark(ans[cur], true);
|
||||||
|
if (pos.v === 'quiz') pos();
|
||||||
}
|
}
|
||||||
function mark(i, replay) {
|
function mark(i, replay) {
|
||||||
var bs = $('#qOpts').querySelectorAll('.opt');
|
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; }
|
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;
|
var res = null;
|
||||||
function finish() {
|
function finish(old) { /* old = 上次的记录:回到结果页时按存下的答案重算、不重新落记录 */
|
||||||
var qs = t.questions;
|
var qs = t.questions;
|
||||||
if (isQuiz) {
|
if (isQuiz) {
|
||||||
var ok = okCount(); res = { r: band(ok), v: ok, p: ok / N, score: ok + '/' + N };
|
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;
|
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 = { r: tied[0], cnt: cnt, pc: pc, score: '' };
|
||||||
}
|
}
|
||||||
res.ans = ans.slice(); res.at = Date.now();
|
res.ans = ans.slice(); res.at = old ? old.at : Date.now();
|
||||||
saveRec({ title: res.r.title, score: res.score, at: res.at });
|
if (!old) saveRec({ title: res.r.title, score: res.score, at: res.at, ans: res.ans });
|
||||||
renderResult();
|
renderResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -713,7 +722,14 @@ mark{background:linear-gradient(transparent 62%,var(--c20) 0);color:inherit;padd
|
|||||||
}, { passive: false });
|
}, { passive: false });
|
||||||
document.addEventListener('touchmove', function (e) { if (!sc.contains(e.target) && !$('#mask').contains(e.target) && e.cancelable) e.preventDefault(); }, { 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>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -648,10 +648,10 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
|
|||||||
<div id="sheet" role="dialog" aria-modal="true"><i class="sg"></i><div class="sbd" id="sbd"></div></div>
|
<div id="sheet" role="dialog" aria-modal="true"><i class="sg"></i><div class="sbd" id="sbd"></div></div>
|
||||||
<div class="toast" id="toast"></div>
|
<div class="toast" id="toast"></div>
|
||||||
|
|
||||||
<script src="topics.js?v=26110252"></script>
|
<script src="topics.js?v=26110253"></script>
|
||||||
<script src="data.js?v=26110252"></script>
|
<script src="data.js?v=26110253"></script>
|
||||||
<script src="feed.js?v=26110252"></script>
|
<script src="feed.js?v=26110253"></script>
|
||||||
<script src="ceshi/meta.js?v=26110252"></script>
|
<script src="ceshi/meta.js?v=26110253"></script>
|
||||||
<script>
|
<script>
|
||||||
(function () {
|
(function () {
|
||||||
'use strict';
|
'use strict';
|
||||||
@@ -717,7 +717,7 @@ button{font:inherit;color:inherit;border:0;background:none;padding:0;cursor:poin
|
|||||||
var CMD = null, CMERR = false;
|
var CMD = null, CMERR = false;
|
||||||
/* 头像编码:数字 = av/NNNN.webp(旧代码头像);'av:c012' = av/c012.webp(卡通/可爱卡通);'/…' = 站内绝对路径(内置头像库 /_bridge/avatars/);其余 = assets/img/mom/xxx.jpg */
|
/* 头像编码:数字 = av/NNNN.webp(旧代码头像);'av:c012' = av/c012.webp(卡通/可爱卡通);'/…' = 站内绝对路径(内置头像库 /_bridge/avatars/);其余 = assets/img/mom/xxx.jpg */
|
||||||
var avP = function (a) { return typeof a === 'number' ? 'av/' + ('000' + a).slice(-4) + '.webp' : a.indexOf('av:') === 0 ? 'av/' + a.slice(3) + '.webp' : a.charAt(0) === '/' ? a : '../assets/img/mom/' + a + '.jpg'; };
|
var avP = function (a) { return typeof a === 'number' ? 'av/' + ('000' + a).slice(-4) + '.webp' : a.indexOf('av:') === 0 ? 'av/' + a.slice(3) + '.webp' : a.charAt(0) === '/' ? a : '../assets/img/mom/' + a + '.jpg'; };
|
||||||
fetch('cm.json?v=26110252').then(function (r) { return r.json(); }).then(function (j) {
|
fetch('cm.json?v=26110253').then(function (r) { return r.json(); }).then(function (j) {
|
||||||
CMD = j; if (openId && NBY[openId]) { renderComments(NBY[openId]); syncBar(NBY[openId]); }
|
CMD = j; if (openId && NBY[openId]) { renderComments(NBY[openId]); syncBar(NBY[openId]); }
|
||||||
}).catch(function () { CMERR = true; if (openId && NBY[openId]) renderComments(NBY[openId]); });
|
}).catch(function () { CMERR = true; if (openId && NBY[openId]) renderComments(NBY[openId]); });
|
||||||
function commentsOf(n) {
|
function commentsOf(n) {
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ main{padding:6px 16px 0}
|
|||||||
</div>
|
</div>
|
||||||
<div class="wb"><button type="button" id="write"><svg class="ic" viewBox="0 0 24 24"><path d="M12 20h9M16.5 3.5a2.1 2.1 0 013 3L7 19l-4 1 1-4z"/></svg>写新的故事</button></div>
|
<div class="wb"><button type="button" id="write"><svg class="ic" viewBox="0 0 24 24"><path d="M12 20h9M16.5 3.5a2.1 2.1 0 013 3L7 19l-4 1 1-4z"/></svg>写新的故事</button></div>
|
||||||
|
|
||||||
<script src="../topics.js?v=26110252"></script>
|
<script src="../topics.js?v=26110253"></script>
|
||||||
<script>
|
<script>
|
||||||
(function () {
|
(function () {
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<meta name="mobile-web-app-capable" content="yes">
|
<meta name="mobile-web-app-capable" content="yes">
|
||||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||||
<title>兜爸心选 · 孕育陪伴</title>
|
<title>兜爸心选 · 孕育陪伴</title>
|
||||||
<!-- V:26110252 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
|
<!-- V:26110253 缓存版本标记:改 css/js 时同步 bump 该值(与 js/app.js 的 VER 同源),静态资源按 mtime 走 ETag 自动刷新 -->
|
||||||
<link rel="stylesheet" href="mama-box.css">
|
<link rel="stylesheet" href="mama-box.css">
|
||||||
<link rel="stylesheet" href="night.css">
|
<link rel="stylesheet" href="night.css">
|
||||||
<!-- 夜晚模式:首屏绘制前就按上次的选择加 class,避免先白后黑闪一下(开关在首页右上角 #nightBtn,逻辑见 app.js) -->
|
<!-- 夜晚模式:首屏绘制前就按上次的选择加 class,避免先白后黑闪一下(开关在首页右上角 #nightBtn,逻辑见 app.js) -->
|
||||||
@@ -2519,7 +2519,7 @@
|
|||||||
<script src="/_bridge/avatar-picker.js?v=26101105"></script>
|
<script src="/_bridge/avatar-picker.js?v=26101105"></script>
|
||||||
<script src="/_bridge/hand-icons.js?v=26101202"></script>
|
<script src="/_bridge/hand-icons.js?v=26101202"></script>
|
||||||
<script src="js/zodiac-art.js"></script>
|
<script src="js/zodiac-art.js"></script>
|
||||||
<script src="guangchang/topics.js?v=26110252"></script>
|
<script src="guangchang/topics.js?v=26110253"></script>
|
||||||
<script src="js/app.js"></script>
|
<script src="js/app.js"></script>
|
||||||
<script>
|
<script>
|
||||||
/* 11-02 首页「孕妈广场」效果稿:地址带 ?gcv=1~6 时,把 #gcHome 换成 demo/gch/vN.css + vN.js 的版式并滚到这一块。
|
/* 11-02 首页「孕妈广场」效果稿:地址带 ?gcv=1~6 时,把 #gcHome 换成 demo/gch/vN.css + vN.js 的版式并滚到这一块。
|
||||||
@@ -2527,7 +2527,7 @@
|
|||||||
(function () {
|
(function () {
|
||||||
var m = location.search.match(/[?&]gcv=([1-6])(?:&|$)/);
|
var m = location.search.match(/[?&]gcv=([1-6])(?:&|$)/);
|
||||||
if (!m) window.__gcDefault = 1;
|
if (!m) window.__gcDefault = 1;
|
||||||
var n = m ? m[1] : '6', l = document.createElement('link'), s = document.createElement('script'), q = m ? Date.now() : 'v=26110252';
|
var n = m ? m[1] : '6', l = document.createElement('link'), s = document.createElement('script'), q = m ? Date.now() : 'v=26110253';
|
||||||
var dir = n === '4' || n === '6' ? 'js/gch/' : 'demo/gch/'; /* 11-03 上正式:定稿 V6(含它套的 V4)并进 js/gch/,其余效果稿仍在 demo/ */
|
var dir = n === '4' || n === '6' ? 'js/gch/' : 'demo/gch/'; /* 11-03 上正式:定稿 V6(含它套的 V4)并进 js/gch/,其余效果稿仍在 demo/ */
|
||||||
l.rel = 'stylesheet'; l.href = dir + 'v' + n + '.css?' + q;
|
l.rel = 'stylesheet'; l.href = dir + 'v' + n + '.css?' + q;
|
||||||
s.src = dir + 'v' + n + '.js?' + q;
|
s.src = dir + 'v' + n + '.js?' + q;
|
||||||
@@ -2536,7 +2536,7 @@
|
|||||||
/* 11-02 品牌露出(用户定 4 处都要):默认加载,?brand=0 可关掉对比;11-03 已并进 js/gch/ */
|
/* 11-02 品牌露出(用户定 4 处都要):默认加载,?brand=0 可关掉对比;11-03 已并进 js/gch/ */
|
||||||
if (!/[?&]brand=0/.test(location.search)) {
|
if (!/[?&]brand=0/.test(location.search)) {
|
||||||
var bl = document.createElement('link'), bs = document.createElement('script');
|
var bl = document.createElement('link'), bs = document.createElement('script');
|
||||||
bl.rel = 'stylesheet'; bl.href = 'js/gch/brand.css?v=26110252'; bs.src = 'js/gch/brand.js?v=26110252';
|
bl.rel = 'stylesheet'; bl.href = 'js/gch/brand.css?v=26110253'; bs.src = 'js/gch/brand.js?v=26110253';
|
||||||
document.head.appendChild(bl); document.body.appendChild(bs);
|
document.head.appendChild(bl); document.body.appendChild(bs);
|
||||||
}
|
}
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
(function () {
|
(function () {
|
||||||
'use strict';
|
'use strict';
|
||||||
/* 页面版本号(YYMMDD+序号):显示在「关于兜爸心选」页底部;bump 时同步 head 注释与 ?v= */
|
/* 页面版本号(YYMMDD+序号):显示在「关于兜爸心选」页底部;bump 时同步 head 注释与 ?v= */
|
||||||
var VER = '26110252';
|
var VER = '26110253';
|
||||||
const $ = (s, c) => (c || document).querySelector(s);
|
const $ = (s, c) => (c || document).querySelector(s);
|
||||||
const $$ = (s, c) => Array.from((c || document).querySelectorAll(s));
|
const $$ = (s, c) => Array.from((c || document).querySelectorAll(s));
|
||||||
|
|
||||||
|
|||||||
@@ -188,5 +188,5 @@
|
|||||||
}
|
}
|
||||||
/* feed.js 首页默认不加载(index.html 只引了 topics.js),这里按需拉一次 */
|
/* feed.js 首页默认不加载(index.html 只引了 topics.js),这里按需拉一次 */
|
||||||
if (window.GC_FEED) init();
|
if (window.GC_FEED) init();
|
||||||
else { var fs = document.createElement('script'); fs.src = 'guangchang/feed.js?v=26110252'; fs.onload = fs.onerror = init; document.body.appendChild(fs); }
|
else { var fs = document.createElement('script'); fs.src = 'guangchang/feed.js?v=26110253'; fs.onload = fs.onerror = init; document.body.appendChild(fs); }
|
||||||
})();
|
})();
|
||||||
|
|||||||
@@ -6,9 +6,9 @@
|
|||||||
(function () {
|
(function () {
|
||||||
var sec = document.getElementById('gcHome');
|
var sec = document.getElementById('gcHome');
|
||||||
if (!sec) return;
|
if (!sec) return;
|
||||||
var l = document.createElement('link'); l.rel = 'stylesheet'; l.href = 'js/gch/v4.css?v=26110252';
|
var l = document.createElement('link'); l.rel = 'stylesheet'; l.href = 'js/gch/v4.css?v=26110253';
|
||||||
document.head.appendChild(l);
|
document.head.appendChild(l);
|
||||||
var s = document.createElement('script'); s.src = 'js/gch/v4.js?v=26110252';
|
var s = document.createElement('script'); s.src = 'js/gch/v4.js?v=26110253';
|
||||||
s.onload = function () { if (sec.querySelector('.g4-foot')) merge(); else sec.addEventListener('gc4-ready', merge, { once: true }); }; /* v4 要先拉 feed.js 才渲染 */
|
s.onload = function () { if (sec.querySelector('.g4-foot')) merge(); else sec.addEventListener('gc4-ready', merge, { once: true }); }; /* v4 要先拉 feed.js 才渲染 */
|
||||||
document.body.appendChild(s);
|
document.body.appendChild(s);
|
||||||
|
|
||||||
|
|||||||
@@ -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 getJSON(u) { return fetch(u, { cache: 'no-cache' }).then(function (r) { if (!r.ok) throw r.status; return r.json(); }); }
|
||||||
|
|
||||||
function related(box) {
|
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 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 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; });
|
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) : ''))
|
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 () {});
|
.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) {
|
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++);
|
setTimeout(function () { el.classList.add('in'); }, 60 * n++);
|
||||||
});
|
});
|
||||||
}, { root: sc, threshold: .08 }) : null;
|
}, { 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) {
|
function show(name) {
|
||||||
|
pos(name);
|
||||||
Object.keys(views).forEach(function (k) { views[k].classList.toggle('on', k === name); });
|
Object.keys(views).forEach(function (k) { views[k].classList.toggle('on', k === name); });
|
||||||
sc.scrollTop = 0;
|
sc.scrollTop = 0;
|
||||||
[].forEach.call(views[name].querySelectorAll('.fade'), function (el) {
|
[].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>';
|
'</span><span class="ck"><svg class="ic"><use href="#i-check" xlink:href="#i-check"/></svg></span></button>';
|
||||||
}).join('');
|
}).join('');
|
||||||
$('#prevBtn').disabled = cur === 0;
|
$('#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;
|
var saved = null;
|
||||||
try { saved = JSON.parse(localStorage.getItem(KEY) || 'null'); } catch (e) {}
|
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');
|
else show('start');
|
||||||
|
|
||||||
/* 禁止下拉回弹:固定外壳 + 容器滚动 + 到顶/到底时拦 touchmove */
|
/* 禁止下拉回弹:固定外壳 + 容器滚动 + 到顶/到底时拦 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++);
|
setTimeout(function () { el.classList.add('in'); }, 60 * n++);
|
||||||
});
|
});
|
||||||
}, { root: sc, threshold: .08 }) : null;
|
}, { 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) {
|
function show(name) {
|
||||||
|
pos(name);
|
||||||
Object.keys(views).forEach(function (k) { views[k].classList.toggle('on', k === name); });
|
Object.keys(views).forEach(function (k) { views[k].classList.toggle('on', k === name); });
|
||||||
sc.scrollTop = 0;
|
sc.scrollTop = 0;
|
||||||
[].forEach.call(views[name].querySelectorAll('.fade'), function (el) {
|
[].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>';
|
'</span><span class="ck"><svg class="ic"><use href="#i-check" xlink:href="#i-check"/></svg></span></button>';
|
||||||
}).join('');
|
}).join('');
|
||||||
$('#prevBtn').disabled = cur === 0;
|
$('#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;
|
var saved = null;
|
||||||
try { saved = JSON.parse(localStorage.getItem(KEY) || 'null'); } catch (e) {}
|
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');
|
else show('start');
|
||||||
|
|
||||||
/* 禁止下拉回弹:固定外壳 + 容器滚动 + 到顶/到底时拦 touchmove */
|
/* 禁止下拉回弹:固定外壳 + 容器滚动 + 到顶/到底时拦 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) {
|
function show(id) {
|
||||||
|
scr = id;
|
||||||
|
if (!booting) save();
|
||||||
[].forEach.call(document.querySelectorAll('.screen'), function (el) { el.classList.toggle('on', el.id === id); });
|
[].forEach.call(document.querySelectorAll('.screen'), function (el) { el.classList.toggle('on', el.id === id); });
|
||||||
$('#bgTop').style.display = id === 'sQ' ? 'none' : '';
|
$('#bgTop').style.display = id === 'sQ' ? 'none' : '';
|
||||||
sc.scrollTop = 0;
|
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 题答案,阶段按全部、收入为空) ================= */
|
/* ================= 存取(v5;兼容读取 v4:路线 + 6 题答案,阶段按全部、收入为空) ================= */
|
||||||
function save() {
|
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() {
|
function load() {
|
||||||
try {
|
try {
|
||||||
var o = JSON.parse(localStorage.getItem(KEY) || 'null') || JSON.parse(localStorage.getItem(KEY4) || 'null');
|
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 换算 */
|
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;
|
var ri = o ? ROUTES.map(function (x) { return x.id; }).indexOf(o.rid) : -1;
|
||||||
if (ri < 0) return false;
|
if (ri < 0) return false;
|
||||||
@@ -1263,7 +1273,11 @@ h1 .mk{background:linear-gradient(transparent 64%,rgba(24,160,88,.24) 0)}
|
|||||||
|
|
||||||
hasBill = load();
|
hasBill = load();
|
||||||
renderStart();
|
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;直接打开(分享 / 刷新)就回同目录的首页,身份原样带回 */
|
||||||
$('#back').addEventListener('click', function () {
|
$('#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++);
|
setTimeout(function () { el.classList.add('in'); }, 60 * n++);
|
||||||
});
|
});
|
||||||
}, { root: sc, threshold: .08 }) : null;
|
}, { 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) {
|
function show(name) {
|
||||||
|
pos(name);
|
||||||
Object.keys(views).forEach(function (k) { views[k].classList.toggle('on', k === name); });
|
Object.keys(views).forEach(function (k) { views[k].classList.toggle('on', k === name); });
|
||||||
sc.scrollTop = 0;
|
sc.scrollTop = 0;
|
||||||
[].forEach.call(views[name].querySelectorAll('.fade'), function (el) {
|
[].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>';
|
'</span><span class="ck"><svg class="ic"><use href="#i-check" xlink:href="#i-check"/></svg></span></button>';
|
||||||
}).join('');
|
}).join('');
|
||||||
$('#prevBtn').disabled = cur === 0;
|
$('#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;
|
var saved = null;
|
||||||
try { saved = JSON.parse(localStorage.getItem(KEY) || 'null'); } catch (e) {}
|
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');
|
else show('start');
|
||||||
|
|
||||||
/* 禁止下拉回弹:固定外壳 + 容器滚动 + 到顶/到底时拦 touchmove */
|
/* 禁止下拉回弹:固定外壳 + 容器滚动 + 到顶/到底时拦 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++);
|
setTimeout(function () { el.classList.add('in'); }, 60 * n++);
|
||||||
});
|
});
|
||||||
}, { root: sc, threshold: .08 }) : null;
|
}, { 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) {
|
function show(name) {
|
||||||
|
pos(name);
|
||||||
Object.keys(views).forEach(function (k) { views[k].classList.toggle('on', k === name); });
|
Object.keys(views).forEach(function (k) { views[k].classList.toggle('on', k === name); });
|
||||||
sc.scrollTop = 0;
|
sc.scrollTop = 0;
|
||||||
[].forEach.call(views[name].querySelectorAll('.fade'), function (el) {
|
[].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>';
|
'</span><span class="ck"><svg class="ic"><use href="#i-check" xlink:href="#i-check"/></svg></span></button>';
|
||||||
}).join('');
|
}).join('');
|
||||||
$('#prevBtn').disabled = cur === 0;
|
$('#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;
|
var saved = null;
|
||||||
try { saved = JSON.parse(localStorage.getItem(KEY) || 'null'); } catch (e) {}
|
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]; });
|
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');
|
else show('start');
|
||||||
|
|
||||||
/* 禁止下拉回弹:固定外壳 + 容器滚动 + 到顶/到底时拦 touchmove */
|
/* 禁止下拉回弹:固定外壳 + 容器滚动 + 到顶/到底时拦 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++);
|
setTimeout(function () { el.classList.add('in'); }, 60 * n++);
|
||||||
});
|
});
|
||||||
}, { root: sc, threshold: .08 }) : null;
|
}, { 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) {
|
function show(name) {
|
||||||
|
pos(name);
|
||||||
Object.keys(views).forEach(function (k) { views[k].classList.toggle('on', k === name); });
|
Object.keys(views).forEach(function (k) { views[k].classList.toggle('on', k === name); });
|
||||||
sc.scrollTop = 0;
|
sc.scrollTop = 0;
|
||||||
[].forEach.call(views[name].querySelectorAll('.fade'), function (el) {
|
[].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>';
|
'</span><span class="ck"><svg class="ic"><use href="#i-check" xlink:href="#i-check"/></svg></span></button>';
|
||||||
}).join('');
|
}).join('');
|
||||||
$('#prevBtn').disabled = cur === 0;
|
$('#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;
|
var saved = null;
|
||||||
try { saved = JSON.parse(localStorage.getItem(KEY) || 'null'); } catch (e) {}
|
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');
|
else show('start');
|
||||||
|
|
||||||
/* 禁止下拉回弹:固定外壳 + 容器滚动 + 到顶/到底时拦 touchmove */
|
/* 禁止下拉回弹:固定外壳 + 容器滚动 + 到顶/到底时拦 touchmove */
|
||||||
|
|||||||
Reference in New Issue
Block a user