2011-11-24 82 views
5

完成我有类似如下的代码等待一个jQueryanimation内for循环

for(i=0, j=10; i<j ; i++){ 
    $('#an-element-'+i).fadeIn(); 
} 

如何让这个循环中每次迭代只一次淡入开始();动画已完成?

编辑---对不起我的坏我没有包括“我”在环

+0

您可以使用[回调](http://api.jquery.com/fadeIn/) – ExpExc

回答

7

for循环是同步的,但动画是异步的。你需要使用递归。

var i = 0, j = 10; 
(function fadeNext() { 
    if (i < j) { 
     $('#an-element-' + i++).fadeIn(fadeNext); 
    } 
})(); 

http://jsfiddle.net/uq9mH/

+0

谢谢,有几个类似的答案,但这是最简单的。正如你所说的循环不适合这个(没有使用延迟) –

+0

这段代码是一个美丽的。 – Mattis

0

根据你的代码,你的循环只会在同一个元素淡出10次。

在任何情况下,你需要的是将通话的淡入方法的回调:http://api.jquery.com/fadeIn/

像这样的东西应该工作(未测试)

var counter = 10; 
function fadeIn(elem) { 
    $(elem).fadeIn('slow', function(){ 
     if (counter > 0) { 
      fadeIn(elem); //up to you how you figure out which element to fade in 
     } 
    }); 
    counter--; 
} 

//var elem = $('.something'); 
fadeIn(elem); 
0

后,您可以执行代码通过将其放置在作为回调参数传递的函数中的动画:

$("#foo").fadeIn("slow",function() { 
    alert("done"); 
}); 

但是它并不十分清楚你想要做什么。你是否褪色了同样的元素10次?

+0

抱歉,我已经稍微调整了代码。问题在于for循环不会等待回调并继续进行。 使用这个片段,所有的元素同时淡入,然后我一次得到10个警告框。 –

+0

@matthew对不起,这不是为十个元素的完整解决方案,只是回调语法的一个例子。在接受的答案递归解决方案是最佳AFAIK –

0

试试这个:

for (i = 0, j = 10; i < j; i++) { 
    $('.try').each(function() { 
     $(this).delay(1000).fadeOut().delay(1000).fadeIn(); 
    }); 
} 

您可以更改延迟函数内的持续时间。 Here is the jsFiddle.

0

,如果你对所有项目进行了固定的延迟,你可以使用下面这行代码:

$(this).fadeIn().delay(2000).fadeOut(); 

,而不是

$(this).fadeIn();