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

勾选td内checkbox时如何为其添加背景色,且避免多行列代码重复

核心优化思路

  • 采用事件委托监听表格根节点的事件,后续新增行无需额外绑定事件,也不需要新增专属类名,只要保持原有类名规则即可
  • 移除重复的事件绑定逻辑,避免内存泄漏
  • 所有状态判断和样式切换逻辑统一收敛,禁用状态的checkbox会自动跳过背景设置

JS代码

// 直接监听整个表格的事件,新增行自动生效
const accessTable = document.querySelector('.access-table');

// 页面初始化:默认所有子checkbox禁用
document.querySelectorAll('.car-park-check').forEach(check => check.disabled = true);

// 统一监听表格内的change事件
accessTable.addEventListener('change', e => {
  const target = e.target;
  // 判断点击的是主checkbox
  if (target.classList.contains('car-park-check-main')) {
    // 获取当前行所有子checkbox
    const row = target.closest('tr');
    const subChecks = row.querySelectorAll('.car-park-check');
    subChecks.forEach(check => {
      check.disabled = !target.checked;
      // 主checkbox取消勾选时,清空子checkbox的选中状态和对应背景
      if (!target.checked) {
        check.checked = false;
        check.closest('td').classList.remove('td-active');
      }
    });
    // 主checkbox自身td的背景切换
    target.closest('td').classList.toggle('td-active', target.checked);
    return;
  }
  // 判断点击的是子checkbox
  if (target.classList.contains('car-park-check')) {
    // 禁用状态直接跳过
    if (target.disabled) return;
    // 切换对应td的背景
    target.closest('td').classList.toggle('td-active', target.checked);
    return;
  }
});

// 支持点击td直接切换checkbox状态
accessTable.addEventListener('click', e => {
  const td = e.target.closest('.access-td');
  if (td && !e.target.classList.contains('access-table-input')) {
    const check = td.querySelector('.access-table-input');
    if (check && !check.disabled) check.click();
  }
});

CSS代码(和原有逻辑一致,可复用)

.td-active {
  background-color: rgb(95, 241, 95) !important;
}

HTML代码(无需调整结构,新增行只要保持类名规则即可)

<table class="table table-bordered access-table">
  <tbody>
    <tr>
      <th scope="row" style="font-weight: 300;">Checkboxes</th>
      <td class="main-td access-td one">
        <label>
          <input type="checkbox" class="access-table-input car-park-check-main"> main checkbox
        </label>
      </td>
      <td class="base-td access-td two">
        <label>
          <input type="checkbox" class="access-table-input car-park-check" disabled> secondary checkbox
        </label>
      </td>
      <td class="base-td access-td four">
        <label>
          <input type="checkbox" class="access-table-input car-park-check" disabled> secondary checkbox
        </label>
      </td>
      <td class="base-td access-td five">
        <label>
          <input type="checkbox" class="access-table-input car-park-check" disabled> secondary checkbox
        </label>
      </td>
      <td class="base-td access-td six">
        <label>
          <input type="checkbox" class="access-table-input car-park-check" disabled> secondary checkbox
        </label>
      </td>
    </tr>
    <!-- 后续新增行只要复制上面tr的结构,类名保持一致即可,不需要额外写JS逻辑 -->
  </tbody>
</table>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:15:02