jqGrid中checkAll方法在if/else代码块内无法正常工作的问题
jqGrid多列复选框首次全选异常问题排查与解决
现有jqGrid测试代码,目标是页面首次加载时自动选中两列的所有复选框,但实际仅能选中其中一列。奇怪的是,将$elem.multiselect("checkAll");移出if/else代码块后,两列复选框能正常全选。
原核心代码:
var checkFirstLoad = getObjectFromLocalStorage('CheckAllCheck'); if (checkFirstLoad == "No") { //do nothing } else { $elem.multiselect("checkAll"); } saveObjectInLocalStorage('CheckAllCheck', 'No');
测试用的本地存储移除代码:
<input type="button" id="removeItemButton" value="Remove Local Item" onclick="removeObjectFromLocalStorage('CheckAllCheck')" /> <script> removeObjectFromLocalStorage = function (storageItemName) { if (typeof window.localStorage !== 'undefined') { window.localStorage.removeItem(storageItemName); } } </script>
问题原因
核心冲突在于localStorage的设置时机与列遍历顺序不匹配:
如果这段代码是在遍历jqGrid列的循环中执行的,首次加载时会出现以下流程:
- 处理第一列:读取
CheckAllCheck不存在(或不为"No"),执行checkAll选中该列,随后将CheckAllCheck设为"No"。 - 处理第二列:此时读取到
CheckAllCheck已经是"No",跳过checkAll执行,最终仅第一列选中。 - 移出if/else后,每列都会强制执行
checkAll,因此两列都能正常选中。
解决方案
调整逻辑,将"是否需要全选"的判断与localStorage设置分离,确保所有列都能执行全选操作:
方案1:统一判断后批量处理列
// 先判断是否需要执行全选 var shouldCheckAll = getObjectFromLocalStorage('CheckAllCheck') !== "No"; // 批量处理所有带复选框的列 if (shouldCheckAll) { $('.multiselect-column').each(function() { $(this).multiselect("checkAll"); }); } // 最后统一设置本地存储 saveObjectInLocalStorage('CheckAllCheck', 'No');
方案2:循环内判断,循环外设置存储
如果必须在列循环中处理,把设置localStorage的逻辑移到循环结束后:
var shouldCheckAll = getObjectFromLocalStorage('CheckAllCheck') !== "No"; // 遍历列的循环逻辑 // ... 列遍历代码 ... if (shouldCheckAll) { $elem.multiselect("checkAll"); } // ... 循环结束 ... // 循环外统一设置本地存储 saveObjectInLocalStorage('CheckAllCheck', 'No');
两种方案都能保证首次加载时,所有列的复选框都会执行全选操作。
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

