如何设置回调以运行 *before* jquery 动画?

Posted

技术标签:

【中文标题】如何设置回调以运行 *before* jquery 动画?【英文标题】:How can I set up a callback to run *before* a jquery animation? 【发布时间】:2010-09-20 09:00:11 【问题描述】:

我正在尝试设置一个循环,其中动画运行一定次数,并且在动画的每次迭代之前运行一个函数。不过,时间最终会关闭——它运行回调 n 次,然后运行动画 n 次。例如:

for (var i=0;i<3;i++) 
  console.log(i);
  $('#blerg').animate(top:'+=50px',75,'linear', function()log('animated'));

输出

0
1
2
animated
animated
animated

在我切换到 jquery 之前,我遇到了 scriptaculous 的这个问题,并发现了一个“beforeSetup”动画回调。有 jquery 等价物吗?

【问题讨论】:

【参考方案1】:

动画是异步的。所以循环运行得非常快,开始三个动画并输出 1、2 和 3。一段时间后,动画完成并输出动画 x 3。这可以解释你的输出。

一些递归怎么样?

do_animation(max_runs, total_runs) 
   log();
   if (total_runs < max_runs) 
       $(foo).animate(..., do_animation(max_runs, ++total_runs));
    

do_animation(3, 0);

试一试,告诉我它是如何运行的。

【讨论】:

【参考方案2】:

您也可以尝试使用队列功能。

http://docs.jquery.com/Effects/queue#callback

我记得 animate 在内部使用相同的执行队列,所以理论上应该可以工作(未经测试)。

/* Safe Namespace + Onload : I do this everywhere */
jQuery(function($) 
 /* Calling this once instead of many times will save 
    a lot of wasted calls to document.getElementById + processing garbage 
  */
 var blerg = $('#blerg');
 var addStep = function( i )
 
     blerg.queue(function() 
        console.log(i);
        $(this).dequeue();
     ); 
     blerg.animate(top:'+=50px',75,'linear'); 
     /* In theory, this works like the callback does */
     blerg.queue(function()
       log('animated');
       $(this).dequeue();
     );
 ;

 for (var i=0;i<3;i++) 
 
  /* I call a function here, because that way you don't need to worry 
     about the fact 'i' will reference the last value of 'i' when the code 
     gets around to executing. */
    addStep(i); 
 
);

Kent,我不太明白你为什么需要明确地将回调放在 队列。并不是你错了——如果回调是一个参数,它就不起作用 animate() - 但我只是好奇。

第二种情况没有必要,但我认为如果要在回调阶段努力做更多事情(例如,另一个动画),它会使代码更加一致和整洁。

然后你只需将下一个动画调用放在第二个 blerg.queue 之后,

更不用说它还有一个额外的好处,那就是创建一些程序上的精确性,因为整个执行序列是在需要运行之前定义的,从而使执行在很大程度上是线性的。

因此,这使得代码仍然“您认为它如何工作”,并使其仍然“您需要它如何工作”运行,而无需担心这一切的整体异步性。 (这使得错误更少,代码更易于维护)

【讨论】:

【参考方案3】:

这两种解决方案都很有效!谢谢 MDCore 和 Kent!

Kent,我不太明白您为什么需要将回调显式放入队列中。并不是你错了——如果回调是 animate() 的参数,它就不起作用——但我只是好奇。

【讨论】:

以上是关于如何设置回调以运行 *before* jquery 动画?的主要内容,如果未能解决你的问题,请参考以下文章

Rails - 在before_destroy回调时取消销毁

在 Rails 控制器操作上设置多个回调

jQuery 插件:添加回调功能

如何保存模型,而在Rails的运行回调

jquery动画回调 - 如何将参数传递给回调

使用 JQuery 更改 :before css 选择器的宽度属性 [重复]