JavaScript中forEach变量未定义且setAttribute失效问题求解
解决"day has not been defined"错误并正确禁用复选框
首先,咱们来定位问题:你报错的根源是forEach的语法用错了。你写的checkboxDayElements.forEach(day in checkboxDayElements)是把in操作符和forEach混在一起了,这完全不是forEach的正确用法——forEach需要传入一个回调函数,而不是这种循环语法,所以导致day变量根本没被正确定义,自然就报错了。
除此之外,还有个小细节问题:你现在是给.checkboxDay这个div容器设置disabled,但disabled属性只能作用于表单元素(比如input),给div设置是没用的,得找到容器里的复选框input再禁用它。
修正后的代码
把你的script部分改成这样:
const checkboxDofMElements = document.querySelectorAll('.checkboxDofM'); const checkboxDayInputs = document.querySelectorAll('.checkboxDay input[type="checkbox"]'); // 直接选中复选框元素 checkboxDofMElements.forEach(el => el.addEventListener('change', event => { // 先判断是否有任意一个DofM复选框被勾选 const hasCheckedDofM = Array.from(checkboxDofMElements).some(container => container.querySelector('input[type="checkbox"]').checked ); // 禁用/启用所有Day复选框 checkboxDayInputs.forEach(checkbox => { checkbox.disabled = hasCheckedDofM; }); if (hasCheckedDofM) { console.log("checked"); } }));
代码说明
- 修正forEach语法:用标准的
forEach((element) => { ... })回调函数形式,正确获取每个复选框元素。 - 准确选中目标元素:直接选中
.checkboxDay容器里的复选框input,而不是容器本身,这样设置disabled才会生效。 - 完善逻辑:添加了
hasCheckedDofM判断,检查是否有任意一个DofM复选框被勾选,这样不管是勾选还是取消勾选,都能正确切换Day复选框的禁用状态(之前的代码只处理了勾选的情况,没处理取消勾选后恢复的情况)。
另外,注意你HTML里的一个小笔误:<div class="checkbox-inline checkboxDofM"= "checkboxDofM">这里多了个= "checkboxDofM",应该改成<div class="checkbox-inline checkboxDofM">,避免DOM结构异常。
内容的提问来源于stack exchange,提问作者Farhad 95
相关产品推荐
相关产品推荐

