web-dev-qa-db-ja.com

ページが読み込まれると、クリックイベントハンドラーがすぐに起動するのはなぜですか?

すべてのリンクにバインドしたい関数で遊んでいます。現在、リンクをクリックしたときではなく、ページが読み込まれたときに関数が起動します。

これが私のコードです。 (関数showDiv()を投稿することもできます。必要な場合は、ここで投稿できます。)ここで何か間違っているのか、バカなのかを教えてもらえますか?

$(document).ready(function(){

    $('a.test').bind("click", showDiv());

});

ありがとう!

38
Jeff

関数の実行結果ではなく、コールバックとして関数にreferenceを渡したい場合:

showDiv()は何らかの値を返します。 returnステートメントが使用されていない場合、undefinedが返されます。

showDivは、実行する必要がある関数への参照です。

これは動作するはずです:

$(document).ready(function(){
    $('a.test').bind("click", showDiv);
});

または、匿名関数を使用して、より高度な機能を実行できます。

...bind('click', function(){
  foo.showDiv(a,b,c);
  ...more code...
});

状況によっては、want関数から返された値をコールバックとして使用できます:

function function foo(which)
{
  function bar()
  {
    console.log('so very true');
  }
  function baz()
  {
    console.log('no way!');
  }
  return which ? bar : baz;
}

...click( foo( fizz ) );

この例では、foofizzを使用して評価され、クリックイベントのコールバックとして割り当てられる関数を返します。

63
zzzzBov

ここで関数showDivを直接呼び出しているようです(showDiv()の戻り結果をクリックハンドラに直接バインドする代わりにバインドしています)。

あなたは次のようなものが欲しい

$(document).ready(function() { $('a.test').bind("click", showDiv); });
5
tjarratt

それを$('a.test').bind("click", showDiv);に変更します(関数参照を渡したいので、showDivの周りに括弧を置かないでください)。

3
Mrchief