fix: 修复点击设置报 Cannot set properties of null (setting 'textContent')
根因:#fullScoresHint 是 #fullScoresBox 的子元素,而 renderFullScores()
用 box.innerHTML 渲染试卷列表时会把它销毁,紧接着的
$('#fullScoresHint').textContent = ... 即变成 null.textContent 抛错。
只要 state.projects 非空(连上卷王、有可答卷)点设置必触发;
projects 为空时走 early return 反而不报错,故此前长期潜伏未被发现
(自 8686eb9 设置重构引入)。
修复:
- index.php:把 #fullScoresHint 移出 #fullScoresBox,改为兄弟元素,
并加注释说明为何不能放回去
- assets/app.js:新增 setFullScoresHint() 带 null 守卫,三个分支统一走它;
即使将来 DOM 结构再变动也不会让整个设置弹窗打不开
This commit is contained in:
+10
-1
@@ -833,17 +833,26 @@
|
||||
}
|
||||
|
||||
// 渲染"各试卷独立满分"列表
|
||||
// 注意:#fullScoresHint 必须位于 #fullScoresBox 之外(见 index.php),
|
||||
// 否则 box.innerHTML 覆盖会销毁它,下面的 textContent 赋值会抛 "Cannot set properties of null"。
|
||||
// 这里仍保留 null 守卫,避免任何 DOM 结构变动导致整个设置弹窗打不开。
|
||||
function setFullScoresHint(text) {
|
||||
const hint = $('#fullScoresHint');
|
||||
if (hint) hint.textContent = text;
|
||||
}
|
||||
function renderFullScores(scores) {
|
||||
const box = $('#fullScoresBox');
|
||||
if (!box) return;
|
||||
if (!state.projects.length) {
|
||||
box.innerHTML = '<span class="hint">暂无试卷,请先连接卷王系统并选择问卷</span>';
|
||||
setFullScoresHint('给某卷填入数字即可单独覆盖默认满分;留空=用默认');
|
||||
return;
|
||||
}
|
||||
// 排除文件夹项:模式为文件夹的无可答卷
|
||||
const surveys = state.projects.filter(p => !((p.mode || '').toLowerCase().includes('folder')));
|
||||
if (!surveys.length) {
|
||||
box.innerHTML = '<span class="hint">尚未获取到可答卷</span>';
|
||||
setFullScoresHint('给某卷填入数字即可单独覆盖默认满分;留空=用默认');
|
||||
return;
|
||||
}
|
||||
box.innerHTML = surveys.map(p => {
|
||||
@@ -853,7 +862,7 @@
|
||||
'<input type="number" min="1" max="1000" data-pid="' + esc(p.id) + '" value="' + esc(val) + '" placeholder="默认">' +
|
||||
'</div>';
|
||||
}).join('');
|
||||
$('#fullScoresHint').textContent = '默认分值为空时使用上方"默认满分";填写即单独覆盖该卷';
|
||||
setFullScoresHint('默认分值为空时使用上方"默认满分";填写即单独覆盖该卷');
|
||||
}
|
||||
|
||||
/* ---------------- 名单 ---------------- */
|
||||
|
||||
@@ -211,9 +211,11 @@ $rosterCount = Roster::count();
|
||||
<div class="fi full">
|
||||
<label>各试卷独立满分</label>
|
||||
<div id="fullScoresBox" class="fullscores">
|
||||
<span class="hint" id="fullScoresHint">未选中试卷时,此处为空;选中某套试卷后保存即在设置中为该卷单独设定满分</span>
|
||||
<span class="hint">未选中试卷时,此处为空;选中某套试卷后保存即在设置中为该卷单独设定满分</span>
|
||||
</div>
|
||||
<p class="hint">给某卷填入数字即可单独覆盖默认满分;留空=用默认</p>
|
||||
<!-- 注意:#fullScoresHint 必须放在 #fullScoresBox 之外,
|
||||
否则 renderFullScores() 的 box.innerHTML 覆盖会把它销毁,导致 textContent 赋值报 null -->
|
||||
<p class="hint" id="fullScoresHint">给某卷填入数字即可单独覆盖默认满分;留空=用默认</p>
|
||||
</div>
|
||||
<div class="fi full checks">
|
||||
<label><input type="checkbox" id="cfgDedupe"> 同一学号只保留最新一份答卷</label>
|
||||
|
||||
Reference in New Issue
Block a user