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

原生JS实现按钮组单按钮禁用功能异常求助

问题解决:点击多个按钮时仅禁用当前点击的按钮

核心原因

HTML里id属性必须唯一,你给两个按钮都设了id="button",调用document.getElementById("button")时只会返回第一个匹配的元素,所以不管点哪个按钮,都只会禁用第一个。

解决方案1:通过事件对象获取当前点击的按钮

修改HTML和JS代码,利用事件对象直接获取触发点击的按钮:

修改后的HTML

<div class="new" id="counter">5</div>
<button class="subtract-btn" onclick="subtract(event)">exec</button>
<button class="subtract-btn" onclick="subtract(event)">exec</button>

修改后的JS

let subtract = (event) => {
  let counter = document.getElementById("counter");
  // 通过event.target获取当前被点击的按钮
  let clickedButton = event.target;
  let newScore = Number(counter.innerText) - 1;
  console.log(newScore);
  counter.innerText = newScore;
  counter.classList.remove("new");
  // 禁用当前点击的按钮
  clickedButton.setAttribute("disabled", "");
}

解决方案2:用事件委托(更推荐,避免inline事件)

如果不想用inline的onclick,可以给父元素绑定事件委托,更灵活且易于维护:

HTML

<div class="new" id="counter">5</div>
<div class="button-container">
  <button class="subtract-btn">exec</button>
  <button class="subtract-btn">exec</button>
</div>

JS

// 获取计数器和按钮容器
const counter = document.getElementById("counter");
const buttonContainer = document.querySelector(".button-container");

// 给容器绑定点击事件
buttonContainer.addEventListener("click", (event) => {
  // 判断点击的是目标按钮
  if (event.target.classList.contains("subtract-btn")) {
    const clickedButton = event.target;
    // 如果按钮已禁用,直接返回避免重复操作
    if (clickedButton.disabled) return;
    
    let newScore = Number(counter.innerText) - 1;
    console.log(newScore);
    counter.innerText = newScore;
    counter.classList.remove("new");
    clickedButton.setAttribute("disabled", "");
  }
});

这种方式不需要给每个按钮单独绑定事件,后续新增按钮也能自动生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 16:05:31