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

Tic-Tac-Toe游戏按钮点击无响应:事件监听器失效问题排查

井字棋按钮点击无响应问题排查与修复

核心问题:事件监听的事件名错误

按钮无响应的直接原因是**addEventListener的事件名使用了onclick——这个方法的第一个参数需要传入不带on前缀的事件类型名称**,正确写法是click,onclick是直接给DOM元素赋值事件处理函数时的属性名,不适用于addEventListener方法。

修正后的JavaScript代码

let boxes = document.querySelectorAll(".box");
let turnO = true;
const winningPatterns = [
  [0, 1, 2],
  [0, 3, 6],
  [0, 4, 8],
  [1, 4, 7],
  [2, 5, 8],
  [2, 4, 6],
  [3, 4, 5],
  [6, 7, 8],
];

boxes.forEach((box) => {
  // 将"onclick"改为"click"
  box.addEventListener("click", () => {
    console.log("box was clicked");
    if (turnO) {
      box.innerText = "O";
      turnO = false;
    } else {
      box.innerText = "X";
      turnO = true;
    }
  });
});

额外优化建议

  • 防止重复点击同一按钮:当前代码允许重复点击同一按钮修改内容,可在事件处理函数开头添加判断,跳过已有内容的按钮:
box.addEventListener("click", () => {
  // 若按钮已有文本,直接终止执行
  if (box.innerText !== "") return;
  
  console.log("box was clicked");
  if (turnO) {
    box.innerText = "O";
    turnO = false;
  } else {
    box.innerText = "X";
    turnO = true;
  }
});
  • 添加重置按钮功能:给重置按钮绑定事件,清空所有按钮文本并重置回合:
const resetBtn = document.getElementById("reset-btn");
resetBtn.addEventListener("click", () => {
  boxes.forEach(box => {
    box.innerText = "";
  });
  turnO = true;
});
  • 兼容CSS嵌套写法:你的CSS使用了嵌套语法,部分未配置预处理器的环境或旧浏览器不支持,建议改为标准写法:
/* CSS added by Editor for demo purpose */
.game {
  display: grid;
  grid-template-columns: repeat(3, max-content);
  grid-gap: 0.5em;
}
.game .box {
  aspect-ratio: 1;
  width: 2em;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:30:05