jQueryの.click-パラメータをユーザー関数に渡す


283

jQueryの.clickを使用してパラメーター付きの関数を呼び出そうとしていますが、機能させることができません。

これは私がそれを機能させたい方法です:

$('.leadtoscore').click(add_event('shot'));

呼び出す

function add_event(event) {
    blah blah blah }

次のようにパラメーターを使用しない場合は機能します。

$('.leadtoscore').click(add_event);
function add_event() {
    blah blah blah }

しかし、add_event関数にパラメーターを渡すことができる必要があります。

どうすればこの特定のことを行うことができますか?

を使用できることはわかって.click(function() { blah }いますが、add_event関数を複数の場所から呼び出して、このようにしたいと考えています。


これはpatricks答えから採用されたもので、すばらしい解決策だと思います:jsfiddle.net/naRRk/1
jAndy

回答:


514

徹底的に、私はjQuery クリックイベントハンドラーのバージョン1.4.3で導入された機能の一部である別のソリューションに出くわしました

これにより、jQueryによって最初のパラメーターとしてイベントハンドラー関数に自動的にフィードバックされるイベントオブジェクトにデータマップを渡すことができます。データマップは.click()最初のパラメーターとして関数に渡され、その後にイベントハンドラー関数が続きます。

これが私が何を意味するかを説明するためのコードです:

// say your selector and click handler looks something like this...
$("some selector").click({param1: "Hello", param2: "World"}, cool_function);

// in your function, just grab the event object and go crazy...
function cool_function(event){
    alert(event.data.param1);
    alert(event.data.param2);
}

この質問はゲームの後半にあることはわかっていますが、以前の回答がこの解決策に導いたので、いつか誰かの役に立つことを願っています!


11
これはまさに私が欲しかったものです(当時)。それ以来、このプロジェクトに取り組んでいませんが、1.4.0を使用していたと思います。これは間違いなく利用可能な最良の方法です。
Paul Hoffer

1
サーバー側で動的にオブジェクトを作成し、クリックイベントを次のようにバインドしています。r.OnClientClick = "imageClicked({param1: '" + obj.Command + "'}); return false"; 次に、クライアント側で次のようにします。function imageClicked(event){if(event.param1 == "GOTO PREVIOUS"){... event.data.param1を使用すると、未定義と表示されます。これをここに打ち込んだので、違いがわかりますね。
家族の

1
@ファミリー-ははは問題ありません。コメントを付けても役に立ちます;)
Chris Kempen

5
@totymedli-同じ構造のオブジェクトを渡して、いつでも別の場所で呼び出すことができると思います:var param_obj = {data : {param1: "Hello", param2: "World"}}; cool_function(param_obj);
Chris Kempen 2013

1
これは、HTML5のdata-属性を使用するよりもはるかに優れています。ありがとうございます。(そして、コールバックで 'this'を使用することについてのJSHintの不平を解決します!)
Matthew Herbst

77

次のような無名関数を使用する必要があります。

$('.leadtoscore').click(function() {
  add_event('shot')
});

この例のように、次のように、パラメータなしの関数名だけを呼び出すことができます。

$('.leadtoscore').click(add_event);

しかし、add_eventメソッドは'shot'パラメーターとして取得されませんが、むしろそれ自体clickeventオブジェクト自体であるコールバックに渡されるものです...したがって、この場合は適用さませんが、他の多くの場合は機能します。パラメータを渡す必要がある場合は、無名関数を使用します。または、次のように、データを使用して渡すオプションがもう 1つあります.bind()

$('.leadtoscore').bind('click', { param: 'shot' }, add_event);

次のadd_eventようにでアクセスします。

function add_event(event) {
  //event.data.param == "shot", use as needed
}

あなたがちょうど言うとき、それは単に意味ですか?次に、通常の無名関数の内部と同じように、add_event関数内で$(this)を使用できることを意味しますか?
Paul Hoffer

2
@phoffer-はい、「ただ」はパラメータがなく、関数名のみを意味します。これは関数への参照であり、clickハンドラに割り当てたい関数を実行した結果ではありません。匿名メソッドと.bind()上記の例で使用できるはthis.loadtoscoreクリックしたを参照します(期待どおり)。最後の例では、内部でadd_event(event)同じ真、使用であるthis$(this)、それはあなたが望むものになるでしょう。
Nick Craver

1
@phoffer:要素を使用するには、要素を明示的に渡す必要がfunction(){ add_event('shot', $(this));}ありfunction add_event(event, element){...}ます。例:および。elementここではjQuery要素になります(bind()Nickが述べたように動作します)。
Felix Kling 2010

@Felix- $(this)関数内でも使用できます。例:jsfiddle.net/tSu5t
Nick Craver

35

あなたがそれをあなたがそれを持っていた方法と呼ぶならば...

$('.leadtoscore').click(add_event('shot'));

...次のadd_event()ような関数を返す必要があります...

function add_event(param) {
    return function() {
                // your code that does something with param
                alert( param );
           };
}

関数が返され、の引数として使用されます.click()


@jAndy- eventパラメータを含む例を投稿していただきありがとうございます。含めるべきだった。:o)
user113716 2010

27

私は.on()を次のように使用して成功しました:

$('.leadtoscore').on('click', {event_type: 'shot'}, add_event);

次に、add_event関数内で次のように「ショット」にアクセスします。

event.data.event_type

詳細については、.on()のドキュメントを参照してください。次の例が提供されています。

function myHandler( event ) {
  alert( event.data.foo );
}
$( "p" ).on( "click", { foo: "bar" }, myHandler );

11

はい、これは古い投稿です。とにかく、誰かがそれを役に立つと思うかもしれません。イベントハンドラーにパラメーターを送信する別の方法を次に示します。

//click handler
function add_event(event, paramA, paramB)
{
    //do something with your parameters
    alert(paramA ? 'paramA:' + paramA : '' + paramB ? '  paramB:' + paramB : '');
}

//bind handler to click event
$('.leadtoscore').click(add_event);
...
//once you've processed some data and know your parameters, trigger a click event.
//In this case, we will send 'myfirst' and 'mysecond' as parameters
$('.leadtoscore').trigger('click', {'myfirst', 'mysecond'});

//or use variables
var a = 'first',
    b = 'second';

$('.leadtoscore').trigger('click', {a, b});
$('.leadtoscore').trigger('click', {a});

6
      $imgReload.data('self', $self);
            $imgReload.click(function (e) {
                var $p = $(this).data('self');
                $p._reloadTable();
            });

javaScriptオブジェクトをonclick要素に設定します。

 $imgReload.data('self', $self);

「this」要素からオブジェクトを取得します。

 var $p = $(this).data('self');

驚くばかり!悲しいことに、jquery変数を使用しようとしたときに機能するのはこれだけです!なぜだかわかりません。:|
cregox 2015

3

私は簡単な解決策を得ます:

 <button id="btn1" onclick="sendData(20)">ClickMe</button>

<script>
   var id; // global variable
   function sendData(valueId){
     id = valueId;
   }
   $("#btn1").click(function(){
        alert(id);
     });
</script>

つまり、値onclickイベントをに渡し、javascript function sendData()変数に初期化して、jqueryイベントハンドラーメソッドで取得します。

これは最初から可能です sendData(valueid)に呼び出されて値を初期化するです。次に、jqueryイベントが実行された後、その値を使用します。

これは簡単なソリューションであり、For Detailソリューションはここにあります。


ここに動的パラメータを渡す方法はありません。ハードコードされた値のみです。
user1451111

この方法では、valueIdのみを渡し、要素とイベントオブジェクトを失います。
ゾルタンスーレーパゴダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.