Javascript jqGrid-单击,右键单击,打开屏幕
在jqGrid中,是否有一种“内置”的方法可以在选择行之前知道单击了什么鼠标按钮 目前,我们有jqGrid,在jqGrid的“onsetrow”事件上绑定了一些操作。问题在于,当用户右键单击该行时,OnSetrow事件将引发并执行操作。我需要的是,当用户右键单击一行时忽略“onsetrow” 编辑:我知道存在onRightClickRow事件,但它在OnSeRow和操作已执行后引发 我发现我可以通过事件对象的“类型”知道单击了什么按钮。单击时,类型为“单击”,单击鼠标右键时,类型为“上下文菜单”…是否存在其他方式,或者我必须检查类型以了解单击了什么按钮 感谢此处列出了活动: 存在onRightClickRow事件 另外,使用普通jquery事件对象和Javascript jqGrid-单击,右键单击,打开屏幕,javascript,jqgrid,Javascript,Jqgrid,在jqGrid中,是否有一种“内置”的方法可以在选择行之前知道单击了什么鼠标按钮 目前,我们有jqGrid,在jqGrid的“onsetrow”事件上绑定了一些操作。问题在于,当用户右键单击该行时,OnSetrow事件将引发并执行操作。我需要的是,当用户右键单击一行时忽略“onsetrow” 编辑:我知道存在onRightClickRow事件,但它在OnSeRow和操作已执行后引发 我发现我可以通过事件对象的“类型”知道单击了什么按钮。单击时,类型为“单击”,单击鼠标右键时,类型为“上下文菜单”
,这将告诉您
您必须使用第三个参数来选择和哪个
或您提到的类型 这是个好问题!这种行为的原因如下。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;
});
}