7

jqGridで、行を選択する前に、どのマウスボタンがクリックされたかを知る「組み込み」の方法はありますか?

現在、jqGridの「onSelectRow」イベントにいくつかのアクションがバインドされたjqGridがあります。問題は、ユーザーがその行を右クリックすると、onSelectRowイベントが発生し、アクションが実行されることです。私が必要としているのは、ユーザーが行を右クリックしたときに「onSelectRow」を無視することです。

編集: onRightClickRowイベントが存在することは知っていますが、onSelectRowとアクションがすでに実行された後に発生しました。

イベントオブジェクトの「タイプ」によって、どのボタンがクリックされたかを知ることができることがわかりました。クリックすると、タイプは右クリックで「クリック」、タイプは「コンテキストメニュー」になります。追加の方法はありますか、それともタイプをチェックしてどのボタンがクリックされたかを確認する必要がありますか?

ありがとう

4

2 に答える 2

10

いい質問ですね!このような動作の理由は次のとおりです。contextmenujqGridは、次のコードを使用して、グリッド<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または前述のタイプの3番目のパラメーターを使用する必要があります。

于 2012-10-28T12:26:04.580 に答える