jQueryでイベントハンドラーに引数を渡すにはどうすればよいですか?


回答:


110

最も簡単な方法は、そのようにすることです(関数にイベント情報を渡したくない場合)...

$("#myid").click(function() {
    myfunction(arg1, arg2);
});

jsFiddle

これにより、clickイベントがトリガーされたときに呼び出される匿名関数が作成されます。これmyfunction()により、指定した引数が呼び出されます。

ThisBindingthis関数が呼び出されたときの値、イベントをトリガーした要素に設定)を保持したい場合は、で関数を呼び出しますcall()

$("#myid").click(function() {
    myfunction.call(this, arg1, arg2);
});

jsFiddle

例に示されている方法で参照を直接渡すことはできません。そうしないと、単一の引数がjQuery eventオブジェクトになります

あなたがいる場合、参照を渡したい、あなたはjQueryの活用しなければならないproxy()(クロスブラウザのラッパーのある機能をFunction.prototype.bind())。これにより、引数のにバインドされている引数を渡すことができますevent

$("#myid").click($.proxy(myfunction, null, arg1, arg2));   

jsFiddle

この例でmyfunction()は、はThisBindingそのまま(nullオブジェクトではないためthis、イベントをトリガーした要素の通常の値が使用されます)、引数(順番に)arg1arg2最後にevent無視できるjQuery オブジェクトで実行されます必要ない場合(関数の引数に名前を付けないでください)。

jQuery eventオブジェクトのdataを使用してデータを渡すこともできますが、これには、(質問の言及のような関数引数ではない)myfunction()経由でアクセスするための変更が必要か、少なくとも前の例や生成されたものなどの手動プロキシ関数を導入する必要があります後者の例を使用します。event.data.arg1


2
ただし、myfunction()のjqueryコンテキスト$(this)は失われます。維持するにmyfunction(this, arg1, arg2)は、匿名ハンドラーから呼び出します。その後、関数で実行できますmyfunction(el, arg1, arg2) { alert($(el).val()); }
ランビネーター

11
@geosteve:保持したい場合は、を使用してくださいmyfunction.call(this, arg1, arg2)
アレックス

1
質問が尋ねるように、それは関数に引数を渡していません。別の関数を呼び出す関数を呼び出しています。匿名関数を簡単にバインド解除できないため、匿名関数内に関数をネストすることはお勧めできません。
ジョージフィリパコス2013年

1
@ geo1701カスタム名前空間を使用し、それにバインドするのが1度だけの場合は可能です。ほとんどの場合、問題ありません。しかし、あなたはあなたが言及したその利益を失います。
アレックス

1
@ geo1701に同意すると、イベントハンドラーを削除する必要があり、彼の解決策はうまくいったものだけです。
Pavel K

76
$("#myid").on('click', {arg1: 'hello', arg2: 'bye'}, myfunction);

function myfunction(e) {

    var arg1 = e.data.arg1;
    var arg2 = e.data.arg2;

    alert(arg1);
    alert(arg2);

}

//call method directly:
myfunction({
    arg1: 'hello agian', 
    arg2: 'bye again'
});

また、onおよびoffメソッドを使用して、特定のイベントハンドラーをバインドおよびバインド解除できます。

例:

$("#myid").off('click', myfunction);

これにより、myfunctionハンドラーが#myidからバインド解除されます


質問が尋ねるように、それは関数に引数を渡していません。
アレックス2013年

4
これが引数を渡す方法です(オブジェクト内にラップします)。
ジョージフィリパコス2013年

それはデータを渡す方法ですが、関数の引数を呼び出すストレッチです。
アレックス2013年

6
これは、On / Offメソッドを使用してリスナーのバインドおよびバインド解除の推奨パターンを使用するため、受け入れられた回答に対するより優れたソリューションです。
ジョージフィリパコス2013年

7
バインド解除が非常にまれであると考える場合は、非常に限られた経験が必要です。他の人からの貢献をうんちしないでください-これは競争ではなく集合的な知識ベースです。正解も不正解もありません。
ジョージフィリパコス2013年

12

確かにアレックスの答えを使用する必要がありますが、プロトタイプライブラリの「バインド」メソッドはEcmascript 5で標準化されており、まもなくブラウザにネイティブに実装されます。それはこのように動作します:

jQuery("#myid").click(myfunction.bind(this, arg1, arg2));

2
ウィルthisあなたは、例えば、この方法を使用する場合は、別のコンテキストにセットをすることbind()にそれをINGのthisそのコンテキストで(グローバル)を有するそのクリックハンドラをもたらすことができるwindowように、オブジェクトをthis参照とは対照的に#myid要素?
アレックス2011年

2
@alex正解です。jQueryは#myid要素をイベントハンドラーの「this」にバインドし、bindメソッドを使用するとそれがオーバーライドされます。数年前にこの記事を書いたので、その時私が何を考えていたかを言うのは難しいようです。私の答えを読んでいる人たちは、これらの詳細を自分で理解できるほど賢いと思います。
ブルトン語

12
それは非常に危険な仮定です。
Travis

@Travisこの記事を書いている時点では(Bretonの回答からほぼ11年後)、caniuse.comはEcmascript 5が98.87%のブラウザーでサポートされていると報告しています。(caniuse.com/#search=ECMAScript%205を参照)
ステファン

@Stephan私のほっそりしたコメントは、Ecmascriptについてpeople reading my answers are smart enough to figure these details out themselvesではなく、@ Bretonを想定したものです。
トラビス

6

古いスレッドですが、検索目的です。試してください:

$(selector).on('mouseover',...);

...そして「データ」パラメータをチェックアウト:http : //api.jquery.com/on/

例えば:

function greet( event ) {
  alert( "Hello " + event.data.name );
}
$( "button" ).on( "click", {name: "Karl"}, greet );
$( "button" ).on( "click", {name: "Addy"}, greet );

4

すばらしい回答はすでにありますが、とにかく、ここに私の2セントがあります。次のものも使用できます。

$("#myid").click({arg1: "foo", arg2: "bar"}, myfunction)

リスナーは次のようになります。

function myfunction(event){ alert(event.data.arg1); alert(event.data.arg2); }


2

シンプル:

$(element).on("click", ["Jesikka"],  myHandler);

function myHandler(event){
   alert(event.data);     //passed in "event.data"
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.