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

如何让井字棋按钮的textContent点击后保持固定不变?

解决井字棋格子点击后内容锁定的问题

方法1:通过判断格子内容提前终止操作

在playRound函数开头添加判断,若当前格子已有内容(非空),直接结束函数,不执行后续的标记放置逻辑:

const playRound = (e) => {
    // 检查格子是否已被占用,有内容则直接返回
    if (e.currentTarget.textContent.trim() !== '') {
        return;
    }

    let playerInput = e.currentTarget.dataset.number
    placeMarker(playerInput, getActivePlayer().marker);
    e.currentTarget.textContent = getActivePlayer().marker;
    _switchPlayerTurn();

    printNewRound();
    console.log(`${board}`);
    console.log(typeof board);
    console.log(GameBoard.getBoard());
}

trim()用来过滤格子里的空白字符,确保只有真正空的格子才允许操作。

方法2:点击后移除该格子的点击事件

第一次点击格子后,直接移除它的click事件监听器,后续点击不会再触发playRound函数,从根源上阻止修改:

const playRound = (e) => {
    let playerInput = e.currentTarget.dataset.number
    placeMarker(playerInput, getActivePlayer().marker);
    e.currentTarget.textContent = getActivePlayer().marker;
    // 移除当前格子的点击事件,防止重复操作
    e.currentTarget.removeEventListener('click', playRound);
    _switchPlayerTurn();

    printNewRound();
    console.log(`${board}`);
    console.log(typeof board);
    console.log(GameBoard.getBoard());
}

方法3:结合数据层判断(更严谨)

井字棋通常会有数据层(比如你的GameBoard)记录棋盘状态,优先判断数据层的对应位置是否已被占用,避免DOM和数据层状态不一致:

const playRound = (e) => {
    let playerInput = e.currentTarget.dataset.number;
    // 从数据层获取棋盘状态,判断该位置是否已被标记
    const boardState = GameBoard.getBoard();
    // 假设数据层初始为空字符串,根据你的实际逻辑调整判断条件
    if (boardState[playerInput] !== '') {
        return;
    }

    placeMarker(playerInput, getActivePlayer().marker);
    e.currentTarget.textContent = getActivePlayer().marker;
    _switchPlayerTurn();

    printNewRound();
    console.log(`${board}`);
    console.log(typeof board);
    console.log(GameBoard.getBoard());
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 22:32:19