Guriddo jqGrid批量编辑模式下文本框获焦选行及事件问题
这个问题我之前帮同行排查过,核心原因其实是jqGrid的setSelection方法默认行为导致的,咱们一步步拆解解决:
为什么selectRow事件没触发?
Guriddo jqGrid的setSelection方法有个关键的第二个参数onselectrow,默认值是false——这意味着当你手动调用setSelection(rowid)时,只会完成行选中的视觉和状态变更,但不会主动触发绑定的onSelectRow回调。这就是你看到行选中了,但事件没反应的根本原因。
解决办法1:修正setSelection的调用参数
如果你想继续用beforeRowClick的思路,只需要在调用时把第二个参数设为true,强制触发事件:
beforeRowClick: function(rowid, e) { // 先判断点击的是文本框,避免不必要的触发 if ($(e.target).is('input[type="text"]')) { $(this).jqGrid('setSelection', rowid, true); // 第二个参数设为true,触发selectRow事件 return true; } }
解决办法2:更精准的文本框focus监听
其实更可靠的方式是直接监听批量编辑文本框的focus事件,当文本框获焦时主动选中行,同时触发事件。这种方式不需要依赖行点击事件,逻辑更直接:
// 用事件委托绑定,确保动态生成的批量编辑文本框也能触发 $("#yourGridId").on('focus', 'input[type="text"]', function() { var $targetRow = $(this).closest('tr.jqgrow'); var rowId = $targetRow.attr('id'); // 选中行并触发selectRow事件 $("#yourGridId").jqGrid('setSelection', rowId, true); });
额外注意点
如果你的批量编辑控件是动态生成的(比如点击"编辑"按钮才渲染文本框),一定要用事件委托的方式绑定focus事件(就像上面代码里用父网格元素绑定),否则动态生成的文本框不会触发绑定的事件。
内容的提问来源于stack exchange,提问作者Sagar Bhosale
相关产品推荐
相关产品推荐

