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

JavaScript如何移除已绑定的点击事件并在需要时重新绑定?

解决方案

方案1:提取事件引用实现绑定/解绑

你现在无法移除事件的核心原因是绑定用了匿名箭头函数,removeEventListener需要传入和绑定时完全一致的函数引用才能生效,所以先把清彩阶段的处理函数提取为可复用的具名函数:

// 统一存储清彩阶段各按钮的事件处理函数
const clearPhaseHandlers = {
  yellow: () => {
    disableAllButtons();
    buttons.greenButton.disabled = false;
    yellow = 0;
  },
  green: () => {
    disableAllButtons();
    buttons.brownButton.disabled = false;
    green = 0;
  },
  brown: () => {
    disableAllButtons();
    buttons.blueButton.disabled = false;
    brown = 0;
  },
  blue: () => {
    disableAllButtons();
    buttons.pinkButton.disabled = false;
    blue = 0;
  },
  pink: () => {
    disableAllButtons();
    buttons.blackButton.disabled = false;
    pink = 0;
  },
  black: () => {
    black = 0;
    checkWinner();
  }
}

修改allRedArePotted函数,绑定事件时使用上面定义的函数引用:

// 注意你原代码这里的函数写法有语法错误,已修正
function allRedArePotted() {
  disableAllButtons();
  buttons.yellowButton.disabled = false;
  buttons.yellowButton.addEventListener('click', clearPhaseHandlers.yellow);
  buttons.greenButton.addEventListener('click', clearPhaseHandlers.green);
  buttons.brownButton.addEventListener('click', clearPhaseHandlers.brown);
  buttons.blueButton.addEventListener('click', clearPhaseHandlers.blue);
  buttons.pinkButton.addEventListener('click', clearPhaseHandlers.pink);
  buttons.blackButton.addEventListener('click', clearPhaseHandlers.black);
}

新增事件移除函数,重启游戏时调用即可清除所有清彩阶段绑定的事件:

function removeClearPhaseEvents() {
  buttons.yellowButton.removeEventListener('click', clearPhaseHandlers.yellow);
  buttons.greenButton.removeEventListener('click', clearPhaseHandlers.green);
  buttons.brownButton.removeEventListener('click', clearPhaseHandlers.brown);
  buttons.blueButton.removeEventListener('click', clearPhaseHandlers.blue);
  buttons.pinkButton.removeEventListener('click', clearPhaseHandlers.pink);
  buttons.blackButton.removeEventListener('click', clearPhaseHandlers.black);
}

方案2:状态判断简化逻辑(更推荐)

不需要反复绑定解绑事件,新增全局游戏状态变量区分阶段,所有逻辑都在初始绑定的事件里处理即可:

// 游戏阶段可选值:red=红球击打阶段、clear=清彩阶段
let gamePhase = 'red'

修改初始绑定的彩球点击事件,加入阶段判断:

buttons.yellowButton.addEventListener('click', () => {
  if (gamePhase === 'red') {
    coloredBall(2);
    return
  }
  // 清彩阶段逻辑
  disableAllButtons();
  buttons.greenButton.disabled = false;
  yellow = 0;
})
// 其余绿、棕、蓝、粉、黑按钮同理修改即可

allRedArePotted函数不需要再绑定新事件,仅修改状态和按钮状态即可:

function allRedArePotted() {
  gamePhase = 'clear'
  disableAllButtons()
  buttons.yellowButton.disabled = false
}

重启游戏时仅需要把gamePhase重置为red,再重置按钮和分数状态即可,无需处理事件绑定逻辑,出错概率更低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:09:05