JqGrid(jQuery 3.3.1)搜索异常:Cannot read property 'getAccessor' of undefined
嘿,遇到这个问题确实闹心,我来帮你捋捋根源和可行的解决办法:
问题根源
jqGrid 3.5是非常老旧的版本(大概2009年发布),而jQuery 3.x系列做了大量API重构和特性变更——包括DOM操作逻辑、事件绑定方式、内部对象结构等核心调整。老版本的jqGrid完全没有适配jQuery 3.x的这些变化,导致filterToolBar功能里依赖的getAccessor方法找不到对应的对象,直接抛出"Cannot read property 'getAccessor' of undefined"错误,进而让页面卡在加载状态。
可行的解决方案
1. 降级jQuery版本(最快最省心)
既然你原来用jQuery 1.11.1时一切正常,那最简单的办法就是把jQuery版本回退到1.x系列的稳定版(比如1.12.4,是1.x分支的最后一个稳定版本)。这个版本和jqGrid 3.5的兼容性经过了时间验证,能直接解决filterToolBar的问题,不需要改动太多代码。
2. 升级jqGrid到兼容jQuery 3.x的版本(长期最优解)
如果你的项目必须使用jQuery 3.x,那强烈建议升级jqGrid到Free jqGrid(这是jqGrid的开源维护分支,一直在持续更新)的最新版本。Free jqGrid完全兼容jQuery 3.x,修复了老版本的大量bug,还新增了很多实用特性。
升级步骤大概是:
- 替换原来的jqGrid的JS和CSS文件为Free jqGrid的资源
- 检查并调整网格的配置项(部分老配置可能被废弃或改名,比如
filterToolBar的参数可能有细微变化) - 测试功能,这个版本的filterToolBar肯定能正常工作
3. 手动修复老jqGrid的代码(不推荐)
如果你实在不想改版本,那只能去啃老jqGrid的源码,找到调用getAccessor的地方,排查是哪个对象变成了undefined。比如可能是jQuery 3.x中获取网格列配置、数据对象的方式变了,需要手动调整对应的代码逻辑。但这种方法风险很高,修复了这个问题后,大概率还会遇到其他兼容性bug,得不偿失。
小提示
如果选择升级Free jqGrid,建议先梳理下老配置和新API的差异,官方文档里有详细的迁移指南,能帮你快速完成适配。
内容的提问来源于stack exchange,提问作者Patrice

