如何为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
相关产品推荐
相关产品推荐

