Javascript jqGrid-单击,右键单击,打开屏幕

Javascript jqGrid-单击,右键单击,打开屏幕,javascript,jqgrid,Javascript,Jqgrid,在jqGrid中,是否有一种“内置”的方法可以在选择行之前知道单击了什么鼠标按钮 目前,我们有jqGrid,在jqGrid的“onsetrow”事件上绑定了一些操作。问题在于,当用户右键单击该行时,OnSetrow事件将引发并执行操作。我需要的是,当用户右键单击一行时忽略“onsetrow” 编辑:我知道存在onRightClickRow事件,但它在OnSeRow和操作已执行后引发 我发现我可以通过事件对象的“类型”知道单击了什么按钮。单击时,类型为“单击”,单击鼠标右键时,类型为“上下文菜单”

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

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

编辑:我知道存在onRightClickRow事件,但它在OnSeRow和操作已执行后引发

我发现我可以通过事件对象的“类型”知道单击了什么按钮。单击时,类型为“单击”,单击鼠标右键时,类型为“上下文菜单”…是否存在其他方式,或者我必须检查类型以了解单击了什么按钮

感谢

此处列出了活动:

存在onRightClickRow事件

另外,使用普通jquery事件对象和
,这将告诉您


您必须使用第三个参数来选择和
哪个
或您提到的类型

这是个好问题!这种行为的原因如下。jqGrid使用以下代码在整个网格
元素上注册事件
上下文菜单的事件处理程序(请参阅)

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

$("#list").unbind("contextmenu");
如果您确实想使用
onRightClickRow
回调,或者如果您不确定是否需要在某个地方使用
jqGridRightClickRow
,您可以“子类化”事件处理程序。该实现稍微依赖于您使用的jQuery版本。从jQuery1.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;
    });
}
/$grid.unbind('contextmenu');

var getEvents=$。_data($grid[0],“events”);//$jQuery中的grid.data(“事件”),但在onRightClickRow引发之前,OnElectrow引发并执行操作,因此要检查onRightClickRow中的“which”为时已晚:(我尝试过,但对于左键和右键单击,事件对象(OnElectrow中的3d参数)在“which”属性中的值为0:(难道你不能在if语句中使用类型和上下文菜单吗?非常好的解决方案-工作非常完美!!我认为我自己无法实现!!谢谢:)只是额外的主题外简单问题…在“var oldmultiselect=this.p.multiselect,result;”行中。“this.p.multiselect”和“result”之间的逗号是什么意思?我的JS知识不错,但记不起该如何工作?它是否用于设置result=undefined?@AlexDn:它定义了两个变量
oldmultiselect
result
,并初始化了第一个变量。JavaScript没有块级变量。因此,函数体中定义的所有变量都将在函数的开头。如果稍后将定义某个变量,则实际代码将在第一行定义,初始化为
undefined
,并赋值,而不是稍后定义。因此建议在第一条语句
var
中定义函数内所需的所有变量。我使用
var oldmultiselect=this.p.multiselect,result;
@AlexDn:如果要遵循上述规则,就应该在主代码的开头定义
getEvents
orgContextmenu
。在这种情况下,我没有遵循规则,只是为了能够在我的答案中发布完整的代码片段。在真正的代码中,我将是
getEv的move definitionents
orgContextmenu
,我会在相应的语句中没有
var
,所以我会有赋值,而不是初始化的定义。谢谢你,Oleg,你有非常描述性的答案!!
//$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;
    });
}