检测select选项重复次数并禁用指定select框的实现求助
解决Select框重复值超过2次时禁用目标Select的问题
首先还原你的场景,你的HTML表单结构如下:
<input class="empcode" type="text"> <!-- 这个下拉框的选项从数据库填充,示例数据如下 --> <select class="select1"> <option value ="05-2018">05-2018</option> <option value ="05-2018">05-2018</option> <option value ="06-2018">06-2018</option> </select> <select class="result"> <option value= "1">1</option> <option value= "1">1</option> <option value= "1">1</option> </select>
你的需求很明确:当select1下拉框里有任意选项值的重复次数超过2次时,禁用result下拉框。
先说说你写的代码里的几个问题:
- 选择器错误:HTML里
select1是class,但你用了#select1(id选择器),导致无法找到目标元素 - 语法错误:代码多了冗余的闭合括号,函数结构不完整,
alert的位置也不对 - 逻辑效率低:每次循环都重复查询DOM中的相同值选项,浪费性能
下面是修复后的完整方案:
步骤1:封装重复值检查函数
我们用一个对象来统计每个选项值的出现次数,只需要遍历一次select1的选项就能完成统计,再判断是否有值的计数超过2次:
function checkDuplicatesAndToggleResult() { // 获取select1的所有选项 const options = $('.select1 option'); // 用对象存储每个value的出现次数 const valueCount = {}; // 遍历选项,统计每个值的出现次数 options.each(function() { const val = $(this).val(); valueCount[val] = (valueCount[val] || 0) + 1; }); // 检查是否有值重复超过2次 let hasOverDuplicate = false; for (const count of Object.values(valueCount)) { if (count > 2) { hasOverDuplicate = true; break; } } // 根据结果禁用或启用result下拉框 $('.result').prop('disabled', hasOverDuplicate); }
步骤2:设置函数触发时机
为了确保页面加载时就生效,同时如果select1的选项有动态修改的情况也能实时检查,我们在两个时机调用这个函数:
// 页面加载完成后执行一次 $(document).ready(function() { checkDuplicatesAndToggleResult(); // 如果select1的选项会动态更新,监听change事件实时检查(静态场景可忽略此行) $('.select1').on('change', checkDuplicatesAndToggleResult); });
代码说明
- 用
valueCount对象统计次数,比反复查询DOM高效很多 - 通过
prop('disabled', 布尔值)来控制result框的禁用状态,这是jQuery控制表单元素禁用的正确方式 - 统一使用
.select1和.result的class选择器,匹配HTML结构
把这些代码放到你的页面里,就能实现你想要的效果了。
内容的提问来源于stack exchange,提问作者M.Gooda




