`;
for (const [letter, text] of Object.entries(q.options)) {
let optClass = '';
if (revealed) {
- if (letter === q.answer) optClass = 'correct';
- else if (state?.value === letter) optClass = 'wrong';
- } else if (state?.value === letter) {
+ if (isMC) {
+ // multiple_choice: 'correct' = 答案里的正确项; 'wrong' = 用户误选的非正确项
+ const isCorrectAnswer = (q.answer || []).includes(letter);
+ const userSelected = selectedSet.includes(letter);
+ if (isCorrectAnswer) optClass = 'correct';
+ else if (userSelected) optClass = 'wrong';
+ } else {
+ if (letter === q.answer) optClass = 'correct';
+ else if (state?.value === letter) optClass = 'wrong';
+ }
+ } else if (isMC ? selectedSet.includes(letter) : state?.value === letter) {
optClass = 'selected';
}
- html += `
-
+ const clickFn = isMC ? `toggleOption('${q.id}','${letter}')` : `selectOption('${q.id}','${letter}')`;
+ const marker = isMC
+ ? `
${selectedSet.includes(letter) ? '✓' : ''}
`
+ : `
`;
+ html += `
+ ${marker}
${letter}. ${escapeHtml(text)}
`;
}
@@ -562,6 +580,19 @@ function selectOption(qId, letter) {
renderQuiz();
}
+// Toggle an option for multiple_choice questions
+function toggleOption(qId, letter) {
+ const q = currentQuestions.find(x => x.id === qId);
+ if (!q || q.type !== 'multiple_choice' || answers[qId]?.revealed) return;
+ const cur = answers[qId];
+ const selected = cur?.selected ? [...cur.selected] : [];
+ const idx = selected.indexOf(letter);
+ if (idx >= 0) selected.splice(idx, 1);
+ else selected.push(letter);
+ answers[qId] = { value: selected.join(','), selected, correct: false, revealed: false };
+ renderQuiz();
+}
+
function saveFill(qId) {
const input = document.getElementById(`input-${qId}`);
if (!input) return;
@@ -611,6 +642,12 @@ function revealAnswer(qId) {
if (q.type === 'single_choice') {
answers[qId].correct = answers[qId].value === q.answer;
+ } else if (q.type === 'multiple_choice') {
+ const userSel = (answers[qId].selected || []).slice().sort();
+ const correctSel = (q.answer || []).slice().sort();
+ answers[qId].correct = userSel.length === correctSel.length &&
+ userSel.every((x, i) => x === correctSel[i]);
+ // 让多选选项未选中状态也能正确显示
}
answers[qId].revealed = true;
renderQuiz();
@@ -619,9 +656,14 @@ function revealAnswer(qId) {
function showAllAnswers() {
currentQuestions.forEach(q => {
if (!answers[q.id]?.revealed) {
- if (!answers[q.id]) answers[q.id] = { value: '', correct: false };
+ if (!answers[q.id]) answers[q.id] = { value: '', selected: [], correct: false };
if (q.type === 'single_choice') {
answers[q.id].correct = answers[q.id].value === q.answer;
+ } else if (q.type === 'multiple_choice') {
+ const userSel = (answers[q.id].selected || []).slice().sort();
+ const correctSel = (q.answer || []).slice().sort();
+ answers[q.id].correct = userSel.length === correctSel.length &&
+ userSel.every((x, i) => x === correctSel[i]);
}
answers[q.id].revealed = true;
}
@@ -631,10 +673,15 @@ function showAllAnswers() {
function submitAll() {
currentQuestions.forEach(q => {
- if (!answers[q.id]) answers[q.id] = { value: '', correct: false };
+ if (!answers[q.id]) answers[q.id] = { value: '', selected: [], correct: false };
if (!answers[q.id].revealed) {
if (q.type === 'single_choice') {
answers[q.id].correct = answers[q.id].value === q.answer;
+ } else if (q.type === 'multiple_choice') {
+ const userSel = (answers[q.id].selected || []).slice().sort();
+ const correctSel = (q.answer || []).slice().sort();
+ answers[q.id].correct = userSel.length === correctSel.length &&
+ userSel.every((x, i) => x === correctSel[i]);
} else if (q.type === 'fill_blank') {
answers[q.id].correct = matchFillAnswer(answers[q.id].value, q.answer, q.answer_rule || 'any');
}