2012-06-25 111 views
3

我如何获得一个函数在for循环中的所有fadeOut之后运行?for循环中的回调函数?

我需要做的是淡出任何可能是可见的,然后淡入的特定对象。由于造型要求,我的topnav和下拉导航都是不同的uls,这就是为什么很棘手的原因。

我不是在写我自己的剧本还没有,所以我(希望)缺少基本的东西非常好。

我已经试过包装的东西的功能,但似乎惹变量的作用域和螺丝的东西了,我不明白...

感谢您的帮助!

$('.ksddtop').on('mouseenter', function(){ 
    var ddtop = $(this).text(); 
    var dd = $('.' + ddtop); 
    $('.ksddwrap').fadeIn(); 
    $(dd).fadeIn(); 

    var ksdds = $('.ksdd'); 
    for(var i = 0; i < ksdds.length; i++) { 
     var ksdd = ksdds[i]; 
     if (! $(ksdd).hasClass(ddtop)){ 
      $(ksdd).fadeOut(); 
     } 
    } 
}); 

回答

6

这应该这样做,如果我理解的要求:

$('.ksdd:not(' + ddtop + ')').fadeOut().promise().done(function(){ 
    // all done fading! 
}); 

淡出所有ksdd元素没有ddtop课程,然后在他们都完成动画时做些事情。

更多信息:

在一个jQuery集合调用.promise给你一个承诺对象时对元素的集合中的所有动画完成后,将解决。这包括排队的动画。

如果改为直接传递一个回调函数来.fadeOut(),你会得到一个回调每个元素而不是一个他们都做了。

+0

是的!这工作很好!你能解释为什么这个工作吗? promise()函数是什么(现在将其视为jquery文档...)?谢谢你的帮助! – luetkemj

+0

感谢您的补充信息! promise()正是我所需要的!现在很高兴在工具箱里有这个! – luetkemj

1

相反的:

var ksdds = $('.ksdd'); 
for(var i = 0; i < ksdds.length; i++) { 
    var ksdd = ksdds[i]; 
    if (! $(ksdd).hasClass(ddtop)){ 
     $(ksdd).fadeOut(); 
    } 
} 

尝试:

$('.ksdd').each(function(){ 
    if (! $(this).hasClass(ddtop)){ 
     $(this).fadeOut(); 
    } 
});