jqGrid navGrid新增表单校验时如何正确关闭表单弹窗
问题原因
$form.hide() 无法完整关闭弹窗的核心原因是:入参$form仅指向弹窗内部的表单内容区,jqGrid的新增/编辑弹窗由三部分组成:内部表单、.ui-jqdialog外层弹窗容器、.ui-widget-overlay全屏遮罩层,单独隐藏表单域自然会残留弹窗外壳和遮罩。
另外你当前绑定的afterShowForm触发时机是表单完全展示之后,本身就不适合做「打开前拦截」的需求,会出现弹窗闪一下再被关掉的视觉问题。
正确实现方案
方案1:使用jqGrid内置关闭方法(推荐)
把校验逻辑前移到beforeShowForm事件(该事件在弹窗正式渲染插入页面前触发),校验不通过时直接调用jqGrid内置的$.jgrid.hideModal方法关闭弹窗,会自动处理DOM隐藏、状态重置、焦点回收所有逻辑,不会有残留。
修正后的配置代码如下:
$('#invAdj').navGrid('#jqGridPager', // 网格工具栏按钮配置 { edit: false, add: true, del: false, search: false, refresh: false, view: false, position: "left", cloneToTop: false }, // 编辑功能配置 {}, // 新增功能配置 { beforeShowForm: function ($form) { if (header === false) { alert("Error"); // 调用jqGrid内置方法关闭整个弹窗,自动处理遮罩和状态重置 $.jgrid.hideModal('#editmod' + this.id, { gb: '#gbox_' + this.id, jqm: true }); return false; } }, closeAfterAdd: true, recreateForm: true, errorTextFormat: function (data) { return 'Error: ' + data.responseText }, url: "InvAdj/Add" } );
注:代码中弹窗ID
#editmodinvAdj是jqGrid默认生成规则,editmod前缀加表格ID,和你代码中#invAdj的表格ID对应,无需额外修改。
方案2:必须在afterShowForm时机关闭的兼容写法
如果业务逻辑要求必须等表单完全渲染后再判断是否关闭,不能只隐藏表单,需要连带处理外层弹窗、遮罩,同时重置jqGrid内部编辑状态,避免下次点击新增按钮无响应:
afterShowForm: function ($form) { if (header === false) { alert("Error"); // 隐藏外层弹窗容器 $form.closest('.ui-jqdialog').hide(); // 移除可见的模态遮罩 $('.ui-widget-overlay:visible').hide(); // 重置表格编辑状态 $('#invAdj').jqGrid('restoreAfterSubmit', 'add'); } }
- 优先选择方案1,拦截时机更早,不会出现弹窗闪烁问题,也不需要手动处理DOM和内部状态,兼容性更好。
- 不建议纯手动写DOM操作关闭弹窗,很容易漏处理jqGrid的内部状态锁,导致后续编辑、新增功能异常。
内容的提问来源于stack exchange,提问作者colin courtney
相关产品推荐
相关产品推荐

