JS中含事件监听器的If/else语句执行异常:记分器故障排查
你的记分器代码失效原因解析
嘿,我来帮你把这段代码的问题拆解清楚!
核心问题:条件判断只执行了一次
你写的if(p1Score !== winningScore && p2Score !== winningScore)这段逻辑,只会在页面刚加载完成的时候运行一次。
页面加载时,p1Score和p2Score初始值都是0,肯定不等于winningScore(5),所以代码会顺利给两个按钮绑定点击事件。但这之后,不管你怎么点击按钮修改分数,这个if-else都不会再重新执行了——它不是一个能实时监听分数变化的“看门逻辑”。
点击事件里缺少实时校验
绑定的点击事件函数里,只做了加分和更新显示的操作,完全没在每次加分后检查是否已经达到获胜分数。所以哪怕某个玩家的分数到了5,你再点击按钮,代码还是会继续累加分数,也不会触发alert("game over")的提示。
修正思路示例
要解决这个问题,你需要把“检查是否获胜”的逻辑放到每次点击事件触发之后,并且在获胜后禁用按钮或者移除点击事件,阻止后续操作:
var p1Button = document.querySelector("#p1"); var p2Button = document.getElementById("p2"); var p1Display = document.getElementById("p1Display"); var p2Display = document.getElementById("p2Display"); var p1Score = 0; var p2Score = 0; var winningScore = 5; var gameOver = false; // 用一个变量标记游戏是否结束 p1Button.addEventListener("click", function(){ if(!gameOver){ // 游戏没结束才执行加分 p1Score++; p1Display.textContent = p1Score; // 加分后立刻检查是否获胜 if(p1Score === winningScore){ gameOver = true; alert("game over"); // 可以禁用按钮,防止继续点击 p1Button.disabled = true; p2Button.disabled = true; } } }); p2Button.addEventListener("click", function(){ if(!gameOver){ p2Score++; p2Display.textContent = p2Score; if(p2Score === winningScore){ gameOver = true; alert("game over"); p1Button.disabled = true; p2Button.disabled = true; } } });
这样修改后,每次点击按钮都会先判断游戏是否已经结束,加分后立刻检查是否达到获胜分数,一旦满足条件就标记游戏结束、弹出提示并禁用按钮,彻底阻止后续加分操作。
内容的提问来源于stack exchange,提问作者Nov1ce




