-1

我有来自 JQuery 的 W3Schools 示例的代码块。在 W3Schools 上试试。我只在 hide 方法调用中添加了一个回调。

第一个案例

 <!DOCTYPE html> <html> <head> <script src="jquery.js"></script> <script> function sayHello(){ alert('hello sit'); }

$(document).ready(function(){   $("button").click(function(){
    $("p").hide(100,sayHello);   }); });

</script> </head> <body> <button>Hide</button> <p>This is a paragraph with little content.</p> <p>This is another small paragraph.</p> </body> </html>

第二种情况是

 <!DOCTYPE html> <html> <head> <script src="jquery.js"></script> <script> function sayHello(){ alert('hello sit'); }

$(document).ready(function(){   $("button").click(function(){
    $("p").hide(100,sayHello());   }); });

</script> </head> <body> <button>Hide</button> <p>This is a paragraph with little content.</p> <p>This is another small paragraph.</p> </body> </html>

两者的唯一区别是使用或不使用大括号传递回调函数。

在第一种情况下,单击隐藏按钮时,我会收到两次问候警报。在第二种情况下,我只收到一次你好警报。我希望警报在这两种情况下都只会出现一次,因为无论是否使用大括号调用零参数函数都无关紧要。

我想了解为什么在不带括号的情况下传递函数名称时它会调用两次回调函数。

4

2 回答 2

3

在第二种情况下,你传递了评估的结果sayHello(),而在第一种情况下,你传递了实际的函数 sayHello

所以因为sayHello显示一个警报,它会在执行后立即显示警报。在第一种情况下,它在hide完成时执行(作为回调),而在第二种情况下,它在您设置调用时执行hide()(可能在隐藏实际发生之前)。

不知道为什么它执行两次,但是 (见下文)不带括号的版本(版本 1)可能是您正在寻找的版本,如果您希望它执行一次hide()完成。

更新:

它显示警报两次的原因是您打hide()了两次电话。您有两个不同的<p>元素,并且.hide()依次为它们中的每一个被调用(并且同样依次为每个元素执行回调)。我猜如果您添加第三个<p>标签,它会第三次发出警报。

来自JQuery 文档

如果为多个元素设置了动画,请务必注意,每个匹配的元素都会执行一次回调,而不是对整个动画执行一次。

您可能希望将您的元素包含在父元素(如 a <div>)中并隐藏它而不是每个单独的<p>元素。

于 2012-09-26T18:11:45.290 回答
2

两者的称呼完全不同。第一个将函数的引用作为第二个参数传递给hide函数。但是,第二个调用您的sayHello函数并将调用结果作为第二个参数传递给hide函数。该sayHello函数在您被调用之前hide被调用。

于 2012-09-26T18:16:52.617 回答