いい質問ですね!このような動作の理由は次のとおりです。contextmenu
jqGridは、次のコードを使用して、グリッド<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;
});
}
デモでは、上記のコードをライブでデモンストレーションします。