2011-04-28 103 views
8

我试图同时动画一组元素(差不多了,还有每个动画之间有一个小的延迟):jQuery的多个动画()回调

$('.block').each(function(i){ 
    $(this).stop().delay(60 * i).animate({ 
    'opacity': 1 
    }, { 
     duration: 250, 
     complete: mycallbackfunction // <- this fires the callback on each animation :(
    }); 
}); 

如何运行一个回调函数后,所有动画都完成?

+0

您可以将各个单独动画。增加一个值,如果该值是=动画数量,那么运行实际功能 – davidosomething 2011-04-28 18:43:03

+1

是否有一个原因,在整个$(“。block”)。each语句之后不能调用mycallbackfunction?还是我误解你的代码? – 2011-04-28 18:44:12

+0

是的。如果我这样做,该功能将立即执行。我想等待动画完成,然后执行它 – Alex 2011-04-28 18:45:32

回答

5

围绕计数器变量使用闭包。

var $blocks = $('.block'); 
var count = $blocks.length; 
$blocks.each(function(i){ 
    $(this).stop().delay(60 * i).animate({ 
    'opacity': 1 
    }, { 
     duration: 250, 
     complete: function() { 
     if (--count == 0) { 
      // All animations are done here! 
      mycallbackfunction(); 
     } 
     } 
    }); 
}); 

请注意,将项目列表保存到$ block变量中以保存查找。

+0

只是在'myCallbackFn()'中进行递减......但是这是我看到的唯一答案 – 2011-04-28 18:51:51

+0

为了在mycallbackfunction()中执行递减操作,它需要在与'count'相同的范围内定义。 OP的例子没有显示mycallbackfunction()是在哪里定义的。 – kcbanner 2011-04-28 18:53:33

+0

谢谢!这似乎工作:D,但你有一个错误:它应该是'if(count == 0)mycallbackfunction();' – Alex 2011-04-28 18:57:28

1
var block = $('.block'); 
    block.each(function(i){ 
    $(this).stop().delay(60 * i).animate({ 
    'opacity': 1 
    }, { 
     duration: 250, 
     complete: i== (block.length-1) ? myCallbackFunction : function(){} 
    }); 
    }); 
1
$('.block').each(function(i){ 
    $(this).stop().delay(60 * i).animate({ 
    'opacity': 1 
    }, { 
     duration: 250, 
     complete: ((i == $('.block').length - 1) ? mycallbackfunction : null) 
    }); 
}); 
4

因为jQuery的1.5,你可以使用$.when[docs],这是一个有点容易编写和理解:

var $blocks = $('.block'); 

$blocks.each(function(i){ 
    $(this).stop().delay(60 * i).animate({ 
    'opacity': 1 
    }, { 
     duration: 250 
    }); 
}); 

$.when($blocks).then(mycallbackfunction); 

DEMO

+0

即使通过'.stop()'停止动画,也会触发回调。 – antitoxic 2011-09-29 17:58:30