9

在回答这个关于 jQuery 效果的问题时,我考虑过callback使用.fadeIn( 500, my_function ).

虽然原则上这是一个可行的想法,但我不知道(如果允许回调递归,jQuery 文档也没有 :( ):

function keep_animating(){
   $("#id").fadeIn(500).fadeOut(500, keep_animating );
}
4

3 回答 3

3

您可以添加调试器断点并测试堆栈大小是否增加。:)

然而,由于动画/淡入淡出使用 setTimeout/setInterval 我高度猜测调用深度不会增加,即它不容易发生堆栈溢出。

于 2011-02-18T15:10:22.247 回答
1

我花时间问'知道的人'......没有堆栈溢出,因为没有明确的递归:fadeIn, fadeOut... 方法都只是在效果队列上创建一个条目。这意味着该keep_animating函数不是在同一上下文中执行的。

致谢 dave methvin :

您所描述的“递归”实际上并不是递归。jQuery 的视觉效果在 setTimeout 计时器上运行,因此回调函数不会像递归那样立即运行。相反,回调在动画完成后运行几个“步骤”,每个步骤都由 setTimeout 触发。

于 2011-02-21T08:47:37.777 回答
0

您的解决方案将递归,并最终破坏堆栈 - 但您将有相当长的一段时间 - 取决于浏览器 - 直到它完成。对于快速演示,这很好,但对于生产就绪代码,您需要采用非递归方法,例如:

function pulse(){
   $("#id").fadeIn(500).fadeOut(500);
}
setInterval(pulse, 1000);

有很多方法可以解决这个问题,但应该能让你到达那里。

于 2011-02-18T16:27:20.317 回答