jQuery .each()循环内return无法终止脚本执行问题求解
问题核心原因
jQuery的.each()方法的回调返回值逻辑和普通函数/循环完全不同,之前的写法存在两个认知误区:
- 在
.each()的回调函数中,return true等价于普通循环的continue,只会跳过当前元素的剩余逻辑,直接进入下一个元素的遍历,既不会终止循环,也不会对外层函数产生任何影响。 - 在
.each()的回调函数中,return false等价于普通循环的break,只会提前终止.each()本身的遍历,但返回值只会被jQuery内部逻辑接收,不会传递给外层的myfunction函数,因此.each()结束后,外层函数会继续往下执行,alert('something')必然会触发。
正确实现方式
要实现「存在未选中复选框时同时终止each遍历和整个函数执行,仅当所有复选框全选时才执行后续alert逻辑」的需求,可以用标记位的方式实现:
<!-- HTML部分无需修改 --> <input type="checkbox" id="a" name="test[]" onclick="myfunction('a');" /> <input type="checkbox" id="b" name="test[]" onclick="myfunction('b');" /> <input type="checkbox" id="c" name="test[]" onclick="myfunction('c');" />
function myfunction(instuff) { let isAllChecked = true; $('input[name^="test"]').each(function() { if ($(this).prop('checked') === false) { // 此处写发现未选中项时需要执行的逻辑 isAllChecked = false; return false; // 终止each循环 } }) // 存在未选中项,直接终止整个函数,不执行后续逻辑 if (!isAllChecked) return; // 所有复选框全选时才会执行到此处 // ...其他业务逻辑... alert('something'); }
更简洁的实现
这个场景不需要手动遍历,可以直接通过jQuery选择器匹配未选中的复选框,代码更精简:
function myfunction(instuff) { // 直接查找name以test开头、未被选中的复选框 const hasUncheckedItem = $('input[name^="test"]:not(:checked)').length > 0; if (hasUncheckedItem) { // 此处写发现未选中项时需要执行的逻辑 return; // 直接终止函数 } // 全选状态下才执行后续逻辑 // ...其他业务逻辑... alert('something'); }
内容的提问来源于stack exchange,提问作者user19320444
相关产品推荐
相关产品推荐

