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

如何通过Vanilla JS实现点击HTML按钮选中对应单选按钮?

问题解决:点击按钮选中对应单选按钮(修复addEventListener报错)

报错原因

document.getElementsByClassName("btn-abo-one") 返回的是HTMLCollection(类数组对象),并非单个DOM元素,而addEventListener是单个DOM元素的专属方法,直接调用就会触发is not a function错误。

同时你的HTML代码存在语法错误:所有button标签的class属性写法有误,多了一个前引号,正确写法应为 <button class="btn btn-lg"> 而非 <button "class="btn btn-lg">,该错误会导致按钮样式失效,也可能干扰元素选择逻辑。

修正方案

第一步:修复HTML语法错误

修正所有button标签的属性写法:

<div class="col-11 d-block btn-abo-one">
   <button class="btn btn-lg">Hier klicken</button>
</div>

<div class="col-11 d-block btn-abo-two">
   <button class="btn btn-lg">Hier klicken</button>
</div>

<div class="col-11 d-block btn-abo-three">
   <button class="btn btn-lg">Hier klicken</button>
</div>

<div class="col-11 d-block btn-abo-four">
   <button class="btn btn-lg">Hier klicken</button>
</div>

<div class="abowrapper">
  <div class="panel panel-default">
    <div class="panel-body">
      <div class="custom-control custom-radio">
        <input type="RADIO" id="ABO#1" class="custom-control-input" value="ABO#1">
        <label class="custom-control-label" for="ABO#1">Abo 1</label>
      </div>
      <div class="custom-control custom-radio">
        <input type="RADIO" id="ABO#2" class="custom-control-input" value="ABO#2">
        <label class="custom-control-label" for="ABO#2">Abo 2</label>
      </div>
      <div class="custom-control custom-radio">
        <input type="RADIO" id="ABO#3" class="custom-control-input" value="ABO#3">
        <label class="custom-control-label" for="ABO#3">Abo 3</label>
      </div>
      <div class="custom-control custom-radio">
        <input type="RADIO" id="ABO#4" class="custom-control-input" value="ABO#4">
        <label class="custom-control-label" for="ABO#4">Abo 4</label>
      </div>
    </div>
  </div>
</div>

第二步:修复JS代码(两种可选方式)

方式1:单个元素绑定事件

用document.querySelector直接获取单个目标元素(每个btn-abo-*类仅对应一个元素):

// 绑定第一个按钮
const btnAboOne = document.querySelector(".btn-abo-one");
btnAboOne.addEventListener('click', function () {
  document.getElementById("ABO#1").checked = true;
});

// 绑定第二个按钮
const btnAboTwo = document.querySelector(".btn-abo-two");
btnAboTwo.addEventListener('click', function () {
  document.getElementById("ABO#2").checked = true;
});

// 绑定第三个按钮
const btnAboThree = document.querySelector(".btn-abo-three");
btnAboThree.addEventListener('click', function () {
  document.getElementById("ABO#3").checked = true;
});

// 绑定第四个按钮
const btnAboFour = document.querySelector(".btn-abo-four");
btnAboFour.addEventListener('click', function () {
  document.getElementById("ABO#4").checked = true;
});

方式2:事件委托(高效适配多元素)

若按钮和单选框数量较多,推荐使用事件委托,仅给父元素绑定一次事件即可:

// 可替换为按钮所在的具体父容器,缩小事件监听范围
document.body.addEventListener('click', function (e) {
  // 匹配点击元素所在的按钮容器
  const btnContainer = e.target.closest('.btn-abo-one, .btn-abo-two, .btn-abo-three, .btn-abo-four');
  if (!btnContainer) return;

  // 根据容器类名匹配对应单选框ID
  let radioId;
  if (btnContainer.classList.contains('btn-abo-one')) {
    radioId = 'ABO#1';
  } else if (btnContainer.classList.contains('btn-abo-two')) {
    radioId = 'ABO#2';
  } else if (btnContainer.classList.contains('btn-abo-three')) {
    radioId = 'ABO#3';
  } else if (btnContainer.classList.contains('btn-abo-four')) {
    radioId = 'ABO#4';
  }

  if (radioId) {
    document.getElementById(radioId).checked = true;
  }
});

额外优化建议

给按钮容器添加自定义属性,直接关联对应单选框ID,让代码更简洁:
修改HTML按钮容器:

<div class="col-11 d-block btn-abo" data-radio-id="ABO#1">
   <button class="btn btn-lg">Hier klicken</button>
</div>
<div class="col-11 d-block btn-abo" data-radio-id="ABO#2">
   <button class="btn btn-lg">Hier klicken</button>
</div>
<div class="col-11 d-block btn-abo" data-radio-id="ABO#3">
   <button class="btn btn-lg">Hier klicken</button>
</div>
<div class="col-11 d-block btn-abo" data-radio-id="ABO#4">
   <button class="btn btn-lg">Hier klicken</button>
</div>

简化后的JS事件委托代码:

document.body.addEventListener('click', function (e) {
  const btnContainer = e.target.closest('.btn-abo');
  if (btnContainer) {
    const radioId = btnContainer.dataset.radioId;
    document.getElementById(radioId).checked = true;
  }
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:35:28