为什么在页面加载时会立即触发click事件处理程序?

Jef*_*eff 38 jquery bind

我正在玩一个我想要绑定到所有链接的函数.目前,该功能在页面加载时触发,而不是在我点击链接时触发.

这是我的代码.(showDiv()如果你需要看的话,我可以在函数中过去.)你能告诉我这里做错了什么或傻吗?

$(document).ready(function(){

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

});
Run Code Online (Sandbox Code Playgroud)

谢谢

zzz*_*Bov 64

您希望将对函数的引用作为回调传递,而不是函数执行的结果:

showDiv()返回一些值; 如果没有return使用任何声明,undefined则返回.

showDiv 是对应该执行的函数的引用.

这应该工作:

$(document).ready(function(){
    $('a.test').bind("click", showDiv);
});
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用匿名函数执行更高级的功能:

...bind('click', function(){
  foo.showDiv(a,b,c);
  ...more code...
});
Run Code Online (Sandbox Code Playgroud)

在某些情况下,您可能希望将函数返回的值用作回调:

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

...click( foo( fizz ) );
Run Code Online (Sandbox Code Playgroud)

在此示例中,foo使用fizz并返回一个函数进行评估,该函数将被指定为click事件的回调.

  • 特别是,`showDiv()`*调用*从*expression*`showDiv`评估的函数对象 - "showDiv"本身仅仅计算一个函数对象(在这个例子中),它可以用作回调.(没有"参考";-) (2认同)
  • +1 这发生在我身上,在我的一生中我无法弄清楚,在阅读您的答案后,很明显..天啊! (2认同)

Sha*_*oli 5

使用下面的行。 showDiv()将在执行该行时立即调用该函数。

$('a.test').bind("click", showDiv);
Run Code Online (Sandbox Code Playgroud)


tja*_*att 5

看起来你直接在那里调用showDiv函数(并将showDiv()的返回结果绑定到click处理程序而不是直接绑定它.

你想要的东西

$(document).ready(function() { $('a.test').bind("click", showDiv); });
Run Code Online (Sandbox Code Playgroud)