jqGrid - 单击,右键单击onSelectRow

Ale*_* Dn 7 javascript jqgrid

在jqGrid中,在行选择之​​前是否有"内置"方式知道单击了什么鼠标按钮?

目前我们有jqGrid,在jqGrid的"onSelectRow"事件上绑定了一些动作.问题是当用户右键单击该行时,onSelectRow事件被提升到并执行操作.我需要的是当用户右键单击一行时忽略"onSelectRow".

编辑:我知道存在onRightClickRow事件,但它在onSelectRow和行动已经执行后引发.

我发现我可以知道事件对象的"类型"点击了什么按钮.单击时,右键单击时类型为"click",类型为"contextmenu"....是否存在其他方式,或者我必须检查类型以了解单击了哪个按钮?

谢谢

Ole*_*leg 10

这是个好问题!这种行为的原因如下.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);
    }
});
Run Code Online (Sandbox Code Playgroud)

如何从代码中看到它调用setSelection方法并调用onRightClickRow回调和触发jqGridRightClickRow事件.因此,如果您不需要选择行,并且如果您不使用onRightClickRow,则jqGridRightClickRow 可以解除绑定事件处理程序:

$("#list").unbind("contextmenu");
Run Code Online (Sandbox Code Playgroud)

如果你确实想要使用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;
    });
}
Run Code Online (Sandbox Code Playgroud)

该演示实时演示了上述代码.