You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JS中含事件监听器的If/else语句执行异常:记分器故障排查

你的记分器代码失效原因解析

嘿,我来帮你把这段代码的问题拆解清楚!

核心问题:条件判断只执行了一次

你写的if(p1Score !== winningScore && p2Score !== winningScore)这段逻辑,只会在页面刚加载完成的时候运行一次
页面加载时,p1Scorep2Score初始值都是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

火山引擎 最新活动