实现报告组单选功能:选中一个报告时禁用其他报告及选项
实现单报告选择及组间禁用功能
没问题,我帮你完善代码来实现这个需求。先明确下核心需求:
选中某报告(如Report 1)的主复选框时,其他所有报告及其对应的选项需被取消选中并禁用;用户每次仅能选择一个报告,仅该报告的对应选项可被选择。
以下是完整的修改后代码,包含HTML和JavaScript:
<!DOCTYPE html> <html> <head> <title>Report Selection</title> <script> // 跨浏览器事件监听工具函数 function listen(element, event, callback) { if (element.attachEvent) { element.attachEvent('on' + event, callback); } else { element.addEventListener(event, callback); } } // 等待DOM加载完成后再执行逻辑 document.addEventListener('DOMContentLoaded', function() { var form = document.querySelector('#myForm'); listen(form, 'click', function(event) { var target = event.srcElement || event.target; // 只处理复选框元素,忽略其他点击 if (target.type !== 'checkbox') return; var currentGroupName = target.getAttribute('name'); // 判断当前点击的是否是报告的主复选框(文本以Report开头) var isMainReport = target.parentElement.textContent.trim().startsWith('Report'); // 仅当点击主报告复选框时执行组间控制逻辑 if (isMainReport) { var isChecked = target.checked; // 所有报告组的名称集合 var allGroupNames = ['check1', 'check2', 'check3']; allGroupNames.forEach(function(groupName) { // 跳过当前选中的报告组 if (groupName === currentGroupName) return; // 获取其他组的所有复选框 var otherCheckboxes = form.querySelectorAll('input[name="' + groupName + '"]'); otherCheckboxes.forEach(function(checkbox) { // 取消选中并禁用其他组的所有复选框 checkbox.checked = false; checkbox.disabled = isChecked; }); }); // 如果取消当前主报告的选中状态,恢复所有复选框的可用状态 if (!isChecked) { var allCheckboxes = form.querySelectorAll('input[type="checkbox"]'); allCheckboxes.forEach(function(checkbox) { checkbox.disabled = false; }); } } }); }); </script> </head> <body> <form id="myForm"> <table> <tr> <td><input type='checkbox' name='check1' value='1'>Report 1</td> <td><input type='checkbox' name='check1' value='2'>R1 Option 1</td> <td><input type='checkbox' name='check1' value='3'>R1 Option 2</td> <td><input type='checkbox' name='check1' value='4'>R1 Option 3</td> </tr> <tr> <td><input type='checkbox' name='check2' value='5'>Report 2</td> <td><input type='checkbox' name='check2' value='6'>R2 Option 1</td> <td><input type='checkbox' name='check2' value='7'>R2 Option 2</td> <td><input type='checkbox' name='check2' value='8'>R2 Option 3</td> </tr> <tr> <td><input type='checkbox' name='check3' value='9'>Report 3</td> <td><input type='checkbox' name='check3' value='10'>R3 Option 1</td> <td><input type='checkbox' name='check3' value='11'>R3 Option 2</td> <td><input type='checkbox' name='check3' value='12'>R3 Option 3</td> </tr> </table> </form> </body> </html>
关键逻辑说明
- DOM加载时机:用
DOMContentLoaded确保页面元素全部加载后再绑定事件,避免出现找不到元素的错误。 - 主报告识别:通过复选框所在单元格的文本是否以
Report开头,精准定位每个组的主开关复选框。 - 组间控制:
- 选中主报告时:遍历其他所有报告组,将组内所有复选框取消选中并禁用,保证用户只能操作当前选中报告的选项。
- 取消主报告选中时:恢复所有复选框的可用状态,允许用户重新选择其他报告。
- 跨浏览器兼容:保留了你原有的
listen函数,确保在IE等老旧浏览器中也能正常运行。
额外优化
- 修正了原HTML中Report 3的value重复问题,给每个复选框设置了唯一的value,避免后续数据处理时出现混淆。
- 添加了页面标题,让页面结构更规范。
内容的提问来源于stack exchange,提问作者J C
相关产品推荐
相关产品推荐

