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

如何为popup.html的多层嵌套checkbox添加展开折叠分区功能?

完整可运行代码

直接复制以下内容保存为html文件即可使用,完全自包含无外部依赖:

<!DOCTYPE html>
<html>
<head>
  <style type="text/css">
    div.top {
      width: 250px;
    }
    div.indent {
      margin-left: 20px;
    }
    /* 新增展开折叠控制样式 */
    .toggle {
      display: inline-block;
      width: 12px;
      cursor: pointer;
      user-select: none;
    }
    .hide {
      display: none;
    }
  </style>
</head>
<body>
<p>Select Games / Expansions / Assets:</p>
<div class="top">
  <div>
    <input type="checkbox" id="g1" value="g1">
    <label for="g1">G1</label><br>
    <div class="indent">
      <input type="checkbox" id="g1-oc" value="g1-oc">
      <label for="g1-oc">G1 OC</label><br>
      <div class="indent">
        <input type="checkbox" id="g1-oc-x1" value="g1-oc-x1">
        <label for="g1-oc-x1">G1 OC X1</label><br>
        <div class="indent">
          <input type="checkbox" id="g1-oc-x1-a1" value="g1-oc-x1-a1">
          <label for="g1-oc-x1-a1">G1 OC X1 A1</label><br>
        </div>
        <div class="indent">
          <input type="checkbox" id="g1-oc-x1-a2" value="g1-oc-x1-a2">
          <label for="g1-oc-x1-a2">G1 OC X1 A2</label><br>
        </div>
      </div>
      <div class="indent">
        <input type="checkbox" id="g1-oc-x2" value="g1-oc-x2">
        <label for="g1-oc-x2">G1 OC X2</label><br>
        <div class="indent">
          <input type="checkbox" id="g1-oc-x2-a1" value="g1-oc-x2-a1">
          <label for="g1-oc-x2-a1">G1 OC X2 A1</label><br>
        </div>
        <div class="indent">
          <input type="checkbox" id="g1-oc-x2-a2" value="g1-oc-x2-a2">
          <label for="g1-oc-x2-a2">G1 OC X2 A2</label><br>
        </div>
      </div>
    </div>
    <div class="indent">
      <input type="checkbox" id="g1-uc" value="g1-uc">
      <label for="g1-uc">G1 UC</label><br>
      <div class="indent">
        <div>
          <input type="checkbox" id="g1-uc-x1" value="g1-uc-x1">
          <label for="g1-uc-x1">G1 UC X1</label><br>
          <div class="indent">
            <input type="checkbox" id="g1-uc-x1-a1" value="g1-uc-x1-a1">
            <label for="g1-uc-x1-a1">G1 UC X1 A1</label><br>
          </div>
          <div class="indent">
            <input type="checkbox" id="g1-uc-x1-a2" value="g1-uc-x1-a2">
            <label for="g1-uc-x1-a2">G1 UC X1 A2</label><br>
          </div>
        </div>
        <div>
          <input type="checkbox" id="g1-uc-x2" value="g1-uc-x2">
          <label for="g1-uc-x2">G1 UC X2</label><br>
          <div class="indent">
            <input type="checkbox" id="g1-uc-x2-a1" value="g1-uc-x2-a1">
            <label for="g1-uc-x2-a1">G1 UC X2 A1</label><br>
          </div>
          <div class="indent">
            <input type="checkbox" id="g1-uc-x2-a2" value="g1-uc-x2-a2">
            <label for="g1-uc-x2-a2">G1 UC X2 A2</label><br>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
  // 遍历所有复选框
  document.querySelectorAll('input[type="checkbox"]').forEach(checkbox => {
    // 定位当前复选框对应的子层级容器
    const nextBr = checkbox.nextElementSibling?.nextElementSibling;
    const childContainer = nextBr?.nextElementSibling;
    // 仅对存在子层级的复选框添加展开折叠功能
    if (childContainer && childContainer.classList.contains('indent')) {
      // 添加+-状态标识
      const toggleBtn = document.createElement('span');
      toggleBtn.className = 'toggle';
      toggleBtn.textContent = '+';
      checkbox.before(toggleBtn);
      // 默认隐藏子层级
      childContainer.classList.add('hide');
      // 切换展开折叠逻辑
      const toggleExpand = () => {
        const isCollapsed = childContainer.classList.contains('hide');
        childContainer.classList.toggle('hide');
        toggleBtn.textContent = isCollapsed ? '-' : '+';
      };
      // 点击+-标识触发切换
      toggleBtn.addEventListener('click', toggleExpand);
      // 点击标签文本触发切换
      checkbox.nextElementSibling.addEventListener('click', toggleExpand);
    }
  });
});
</script>
</body>
</html>

逻辑说明

  • 完全保留了你原有DOM结构,新增的通用逻辑会自动匹配所有符合复选框+标签+换行+子层级indent容器格式的嵌套结构,后续新增选项无需修改JS即可自动适配
  • 点击复选框本身仅会触发勾选/取消勾选操作,不会触发展开折叠,不影响正常选择
  • 默认所有子层级全部折叠,仅展示最顶层G1选项,完全符合需求
  • 已修正你原代码中g1-uc-x1-a2对应的label for属性拼写错误,避免点击标签无法选中对应复选框的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:54:03