这是个好问题!这种行为的原因如下。jqGrid使用以下代码contextmenu
为整个网格元素上的事件注册一个事件处理程序(请参见此处)<table>
.bind('contextmenu', function(e) {
td = e.target;
ptr = $(td,ts.rows).closest("tr.jqgrow");
if($(ptr).length === 0 ){return;}
if(!ts.p.multiselect) { $(ts).jqGrid("setSelection",ptr[0].id,true,e); }
ri = ptr[0].rowIndex;
ci = $.jgrid.getCellIndex(td);
$(ts).triggerHandler("jqGridRightClickRow", [$(ptr).attr("id"),ri,ci,e]);
if ($.isFunction(this.p.onRightClickRow)) {
ts.p.onRightClickRow.call(ts,$(ptr).attr("id"),ri,ci, e);
}
});
从代码中可以看出它调用setSelection
方法并调用onRightClickRow
回调和触发jqGridRightClickRow
事件。因此,如果您不需要选择行并且不使用onRightClickRow
并且jqGridRightClickRow
您可以取消绑定事件处理程序:
$("#list").unbind("contextmenu");
如果您确实想要使用onRightClickRow
回调,或者如果您不确定是否需要在jqGridRightClickRow
某个地方使用,您可以“子类化”事件处理程序。实现有点依赖于您使用的 jQuery 版本。从 jQuery 1.8 开始,应该使用另一个调用来获取在 DOM 元素上注册的当前事件。相应的代码可能如下:
//$grid.unbind('contextmenu');
var getEvents = $._data($grid[0], "events"); // $grid.data("events") in jQuery ver<1.8
if (getEvents && getEvents.contextmenu && getEvents.contextmenu.length === 1) {
var orgContextmenu = getEvents.contextmenu[0].handler;
$grid.unbind('contextmenu', orgContextmenu);
$grid.bind('contextmenu', function(e) {
var oldmultiselect = this.p.multiselect, result;
this.p.multiselect = true; // set multiselect to prevent selection
result = orgContextmenu.call(this, e);
this.p.multiselect = oldmultiselect; // restore multiselect
return result;
});
}
该演示现场演示了上述代码。