在jqGrid中,在行选择之前是否有“内置”方式知道单击了哪个鼠标按钮?
目前我们有jqGrid,在jqGrid的“onSelectRow”事件上绑定了一些动作。问题是当用户右键单击该行时,onSelectRow事件被提升到并执行操作。我需要的是当用户右键单击一行时忽略“onSelectRow”。
编辑:我知道存在onRightClickRow事件,但是在onSelectRow和行动已经执行之后它会被提升。
我发现我可以知道事件对象的“类型”所点击的按钮。单击时,右键单击时类型为“click”,类型为“contextmenu”....是否存在其他方式,或者我必须检查类型以了解单击了哪个按钮?
由于
答案 0 :(得分:10)
这是个好问题!这种行为的原因如下。 jqGrid使用以下代码在整个网格contextmenu
元素上注册事件<table>
的事件处理程序(请参阅here)
.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;
});
}
The demo现场演示上述代码。
答案 1 :(得分:0)
此处列出了事件:http://www.trirand.com/jqgridwiki/doku.php?id=wiki:events
有一个onRightClickRow事件。
另外,使用普通的jquery事件对象和which
会告诉你。 http://api.jquery.com/event.which/
您必须使用onRowSelected和which
的第3个参数或您提到的类型。