You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过className条件触发函数?答题应用计分功能故障排查

答题应用计分功能故障排查与修复

问题描述

我正在开发一款答题应用,用户可从4个选项中选择其一。点击选项后,元素类名会从selectionFalse切换为selectionTrue。点击提交按钮可切换至下一题,但无法增加correct计分变量。在pullQuestions()函数中,当判断op1.className等于selectedTrue时调用isCorrect()函数,预期计分增加但该函数未触发。已确认选项类名切换功能正常(视觉及控制台均验证),附上相关代码,寻求问题解决方法。

相关代码片段

PullQuestions() 函数(第0题逻辑)

if (question.id == 0) {

    document.getElementById("headerQ").innerHTML = question[0].headerQ;
    document.getElementById("content").innerHTML = question[0].content;
    document.getElementById("op1").innerHTML = question[0].op1;
    document.getElementById("op2").innerHTML = question[0].op2;
    document.getElementById("op3").innerHTML = question[0].op3;
    document.getElementById("op4").innerHTML = question[0].op4;

    if (op1.className == "selectedTrue") {
        isCorrect();
    }

    console.log("Scoring System Logging: ", question.id, correct);
    }
}

isCorrect() 计分函数

function isCorrect() {
    correct++;
    console.log("isCorrect()", "Scoring System Logging: ", question.id,  correct);
}

提交按钮函数 submitA()

function submitA() {
    question.id++;
    pullQuestions();

    console.log("submitA()", "Scoring System Logging: ", question.id, correct);
}

选项切换代码

// Option 1
function select1() {
    
    if (op1.className == "selectionFalse") {
    document.getElementById("op1").className = "selectionTrue";
    document.getElementById("op2").className = "selectionFalse";
    document.getElementById("op3").className = "selectionFalse";
    document.getElementById("op4").className = "selectionFalse";

    console.log("selected1()", "If Condition", op1.className);
    }

    else {
    document.getElementById("op1").className = "selectionFalse";
    console.log("selected1()", "If Condition", op1.className);
    }   
}

// Option 2
function select2() {

    if (op2.className == "selectionFalse") {
    document.getElementById("op1").className = "selectionFalse";
    document.getElementById("op2").className = "selectionTrue";
    document.getElementById("op3").className = "selectionFalse";
    document.getElementById("op4").className = "selectionFalse";

    console.log("selected2()", "If Condition", op2.className);
    }

    else {
    document.getElementById("op2").className = "selectionFalse";
    console.log("selected1()", "If Condition", op2.className);
    }   
} 

// Option 3
function select3() {

    if (op3.className == "selectionFalse") {
    document.getElementById("op1").className = "selectionFalse";
    document.getElementById("op2").className = "selectionFalse";
    document.getElementById("op3").className = "selectionTrue";
    document.getElementById("op4").className = "selectionFalse";

    console.log("selected3()", "If Condition", op3.className);
    }

    else {
    document.getElementById("op3").className = "selectionFalse";
    console.log("selected3()", "If Condition", op3.className);
    }   
}

// Option 4
function select4() {

    if (op4.className == "selectionFalse") {
    document.getElementById("op1").className = "selectionFalse";
    document.getElementById("op2").className = "selectionFalse";
    document.getElementById("op3").className = "selectionFalse";
    document.getElementById("op4").className = "selectionTrue";

    console.log("selected4()", "If Condition", op4.className);
    }

    else {
    document.getElementById("op4").className = "selectionFalse";
    console.log("selected4()", "If Condition", op4.className);
    }   
}

问题根源与修复方案

1. 类名字符串拼写错误

你在选项切换代码里用的是selectionTrue/selectionFalse(带字母e),但pullQuestions()里判断的是selectedTrue(少了e),导致条件永远不成立,isCorrect()自然不会触发。

修复:把pullQuestions()里的判断条件改成正确的类名:

if (op1.className == "selectionTrue") {
    isCorrect();
}

2. 计分逻辑时机错误

当前逻辑是加载新题时才去判断上一题的选中状态,但此时新题已经覆盖了旧选项的内容和状态,判断时机完全错误。应该在提交时先检查当前题的答案,再加载新题。

修复:调整submitA()函数的逻辑顺序:

function submitA() {
    // 先判断当前题(提交前的题目)是否答对
    if (question.id == 0 && document.getElementById("op1").className == "selectionTrue") {
        isCorrect();
    }
    // 再切换到下一题
    question.id++;
    pullQuestions();

    console.log("submitA()", "Scoring System Logging: ", question.id, correct);
}

如果后续有更多题目,可以把正确选项的信息存在题目数据里(比如question[question.id].correctOp = "op1"),这样不用写多个if判断,直接动态获取正确选项ID。

3. 可选:简化选项切换代码

目前的选项切换代码重复度很高,可以合并成一个通用函数,减少冗余:

function selectOption(optionId) {
    // 重置所有选项为未选中状态
    ["op1", "op2", "op3", "op4"].forEach(id => {
        document.getElementById(id).className = "selectionFalse";
    });
    // 切换当前选项的选中状态
    const currentOp = document.getElementById(optionId);
    currentOp.className = currentOp.className === "selectionFalse" ? "selectionTrue" : "selectionFalse";
    console.log(`selected${optionId.slice(-1)}()`, "If Condition", currentOp.className);
}

然后把HTML中选项的点击事件改成selectOption('op1')、selectOption('op2')即可,代码更简洁易维护。

内容的提问来源于stack exchange,提问作者user17949142

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 02:35:19