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

JavaScript新手求助:答题测验代码点击事件报错修复

问题分析与修复指导

核心错误1:变量与函数同名冲突

你定义的分数变量(onePiece、deathNote等)和对应的点击处理函数重名了。JavaScript中函数本质也是变量,同名会导致变量被函数覆盖,执行onePiece += 1时相当于给函数做加法操作,直接引发报错,同时事件绑定的引用也会失效。

修复方案:

给分数变量添加前缀区分,比如score_,修改后的代码片段:

// 修改分数变量名
var score_onePiece = 0;
var score_deathNote = 0;
var score_haikyuu = 0;
var score_fruitsBasket = 0;
var questionCount = 0;

然后对应修改每个函数里的分数累加逻辑,以onePiece函数为例:

function onePiece() {
    score_onePiece += 1; // 使用修改后的变量名
    questionCount += 1;

    console.log("questionCount =" + questionCount + "onePiece =" + score_onePiece);

    if (questionCount == 5) {
        console.log("You have finished the quiz!")
        updateResult();
    }
}

其余三个处理函数(deathNote、haikyuu、fruitsBasket)做同样修改,把函数内的变量名替换为带score_前缀的版本。

核心错误2:DOM元素获取时机错误

如果你的JS代码在HTML元素加载完成前执行(比如放在<head>标签里),document.getElementById会返回null,调用addEventListener时会抛出"Cannot read property 'addEventListener' of null"的错误。

修复方案:

把所有获取DOM元素和绑定事件的代码,放到DOM加载完成的回调函数中:

// 等待DOM加载完成后再执行DOM操作
document.addEventListener('DOMContentLoaded', function() {
    //question 1
    var q1a1 = document.getElementById("q1a1");
    var q1a2 = document.getElementById("q1a2");
    var q1a3 = document.getElementById("q1a3");
    var q1a4 = document.getElementById("q1a4");
    //question 2
    var q2a1 = document.getElementById("q2a1");
    var q2a2 = document.getElementById("q2a2");
    var q2a3 = document.getElementById("q2a3");
    var q2a4 = document.getElementById("q2a4");
    //question 3
    var q3a1 = document.getElementById("q3a1");
    var q3a2 = document.getElementById("q3a2");
    var q3a3 = document.getElementById("q3a3");
    var q3a4 = document.getElementById("q3a4");
    //question 4
    var q4a1 = document.getElementById("q4a1");
    var q4a2 = document.getElementById("q4a2");
    var q4a3 = document.getElementById("q4a3");
    var q4a4 = document.getElementById("q4a4");
    //question 5
    var q5a1 = document.getElementById("q5a1");
    var q5a2 = document.getElementById("q5a2");
    var q5a3 = document.getElementById("q5a3");
    var q5a4 = document.getElementById("q5a4");

    // 绑定点击事件
    //question 1
    q1a1.addEventListener("click", onePiece);
    q1a2.addEventListener("click", deathNote);
    q1a3.addEventListener("click", haikyuu);
    q1a4.addEventListener("click", fruitsBasket);
    //question 2
    q2a1.addEventListener("click", fruitsBasket);
    q2a2.addEventListener("click", haikyuu);
    q2a3.addEventListener("click", deathNote);
    q2a4.addEventListener("click", onePiece);
    //question 3
    q3a1.addEventListener("click", deathNote);
    q3a2.addEventListener("click", onePiece);
    q3a3.addEventListener("click", fruitsBasket);
    q3a4.addEventListener("click", haikyuu);
    //question 4
    q4a1.addEventListener("click", haikyuu);
    q4a2.addEventListener("click", deathNote);
    q4a3.addEventListener("click", onePiece);
    q4a4.addEventListener("click", fruitsBasket);
    //question 5
    q5a1.addEventListener("click", onePiece);
    q5a2.addEventListener("click", deathNote);
    q5a3.addEventListener("click", haikyuu);
    q5a4.addEventListener("click", fruitsBasket);
});

可选优化:简化重复代码

可以用对象统一管理分数,再写一个通用处理函数,减少冗余代码:

// 用对象统一管理所有分数
var scores = {
    onePiece: 0,
    deathNote: 0,
    haikyuu: 0,
    fruitsBasket: 0
};
var questionCount = 0;

// 通用点击处理函数
function handleAnswer(animeKey) {
    scores[animeKey] += 1;
    questionCount += 1;
    console.log(`questionCount = ${questionCount}, ${animeKey} = ${scores[animeKey]}`);
    if (questionCount === 5) {
        console.log("You have finished the quiz!");
        updateResult();
    }
}

// 绑定事件时改为调用通用函数
q1a1.addEventListener("click", () => handleAnswer("onePiece"));
q1a2.addEventListener("click", () => handleAnswer("deathNote"));
// 其余选项同理替换

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:15:58