7

在 jqGrid 中,在行选择之​​前,是否有一种“内置”方法可以知道单击了哪个鼠标按钮?

目前我们有 jqGrid,一些动作绑定在 jqGrid 的“onSelectRow”事件上。问题是当用户右键单击该行时,会引发 onSelectRow 事件并执行操作。我需要的是当用户右键单击一行时忽略“onSelectRow”。

编辑:我知道存在 onRightClickRow 事件,但它在 onSelectRow 和已经执行的操作之后引发。

我发现我可以知道事件对象的“类型”单击了哪个按钮。单击时,右键单击时类型为“单击”,类型为“上下文菜单”....是否存在附加方式,或者我必须检查类型才能知道单击了哪个按钮?

谢谢

4

2 回答 2

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);
    }
});

从代码中可以看出它调用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;
    });
}

该演示现场演示了上述代码。

于 2012-10-28T12:58:20.230 回答
0

事件列在这里: http ://www.trirand.com/jqgridwiki/doku.php?id=wiki:events

有一个 onRightClickRow 事件。

另外,使用普通的 jquery 事件对象which会告诉你。http://api.jquery.com/event.which/

您必须将第三个参数用于 onRowSelectedwhich或您提到的类型。

于 2012-10-28T12:26:04.580 回答