为何我的JavaScript else if语句无法正常工作?技术求助
嘿,我来帮你捋捋你代码里的问题!你的else if逻辑确实踩了几个坑,还有一些小细节没处理到位,咱们一步步来修复:
核心问题梳理
1. 判断逻辑完全跑偏
你现在的evaluateAnswer函数里,是拿字符串'box1'和数字类型的correctAnswer做比较(比如if ('box1' === correctAnswer)),这俩类型都不一样,肯定永远不相等啊!而且你的else if结构逻辑也错了:第一个else if是'box1' !== correctAnswer,这会直接覆盖所有后续判断——只要第一个条件不满足,就会进入这个分支,后面的box2/box3/box4判断根本不会执行,直接显示wrong。
更关键的是:你的函数根本不知道用户点击的是哪个盒子,现在不管点哪个选项,执行的判断逻辑都一模一样,完全没法对应到用户选的答案。
2. 拼写错误导致样式失效
你写的style.diplay是错的!正确的属性名是style.display(少了个s),这个拼写错误会直接导致你没法显示/隐藏correct和wrong的提示框。
3. 提示框没有自动隐藏逻辑
现在你显示了correct或wrong后,没有在生成新题/下次点击时隐藏它们,导致提示框会一直停留在页面上,影响后续交互。
修复后的完整代码与解释
第一步:修改HTML的点击事件
把点击的盒子元素传给evaluateAnswer函数,这样函数就能知道用户选的是哪个选项:
<div id="correct"> Correct! </div> <div id="wrong"> Try Again </div> <div id="question"> <span id="firstInt"></span><span id="secondInt"></span> </div> <div id="instruction"> Click on the Correct Answer </div> <div id="choices"> <div id="box1" onclick="evaluateAnswer(this)" class="boxes"></div> <div id="box2" onclick="evaluateAnswer(this)" class="boxes"></div> <div id="box3" onclick="evaluateAnswer(this)" class="boxes"></div> <div id="box4" onclick="evaluateAnswer(this)" class="boxes"></div> </div> <div id="startreset"> Start Game </div>
第二步:重写evaluateAnswer函数
现在函数能接收用户点击的盒子,判断答案是否正确,并处理提示和加分逻辑:
function evaluateAnswer(selectedBox) { // 先隐藏之前的提示框,避免叠加显示 const correctBox = document.getElementById("correct"); const wrongBox = document.getElementById("wrong"); correctBox.style.display = 'none'; wrongBox.style.display = 'none'; // 获取用户选择的答案,转成数字类型(因为innerHTML是字符串) const selectedAnswer = parseInt(selectedBox.innerHTML); if (selectedAnswer === correctAnswer) { // 答对了:加分、显示提示、延迟生成新题(让用户看到提示) score++; document.getElementById("scorevalue").innerHTML = score; correctBox.style.display = 'block'; setTimeout(generateQA, 1000); } else { // 答错了:仅显示提示 wrongBox.style.display = 'block'; } }
第三步:完善generateQA和stopGame函数
- 在生成新题时,先隐藏提示框,避免切换题目时提示残留:
function generateQA(){ // 先隐藏提示框 document.getElementById("correct").style.display = 'none'; document.getElementById("wrong").style.display = 'none'; // 原有的题目生成逻辑不变 const Na = 1 + Math.round(Math.random() * 9); const Nb = 1 + Math.round(Math.random() * 9); correctAnswer = Na * Nb; const w1 = 1 + Math.round(Math.random() * 16); const w3 = 1 + Math.round(Math.random() * 22); const w4 = 1 + Math.round(Math.random() * 92); document.getElementById("question").innerHTML = Na + "x" + Nb; console.log(correctAnswer); const myArray = [w1, correctAnswer, w3, w4]; const result = myArray.shuffle(); document.getElementById("box1").innerHTML = result[0]; document.getElementById("box2").innerHTML = result[1]; document.getElementById("box3").innerHTML = result[2]; document.getElementById("box4").innerHTML = result[3]; }
- 在游戏结束时,隐藏提示框,避免和game-over弹窗重叠:
function stopGame() { gameOn = false; if (interval) { clearInterval(interval); interval = null; } document.getElementById("startreset").innerHTML = "Start Game"; document.getElementById("time-remaining").style.display = ""; // 隐藏提示框 document.getElementById("correct").style.display = 'none'; document.getElementById("wrong").style.display = 'none'; }
第四步:优化变量声明
把correctAnswer声明为全局变量(避免隐式全局),在代码顶部加上:
let correctAnswer; // 代替原来未声明的correctAnswer
这样修改后,你的逻辑就能正常工作了:点击选项时会判断答案对错,显示对应的提示,答对后自动加分并生成新题,答错仅显示重试提示,游戏结束时也能正确清理页面状态。
内容的提问来源于stack exchange,提问作者lukes jaafari

