for循环中的回调函数?

时间:2012-06-25 18:11:59

标签: javascript jquery for-loop callback

如何在for循环中的所有fadeOuts之后运行函数?

我需要做的是淡出任何可见的东西然后淡化特定的对象。由于样式要求,我的topnav和dropdown导航用于不同的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();
        }
    }
}); 

2 个答案:

答案 0 :(得分:6)

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

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

淡出所有没有ksdd类的ddtop个元素,然后在完成动画制作时执行某些操作。

更多信息:

在jQuery集合上调用.promise会为您提供一个promise对象,该对象将在元素集合上的所有动画完成时解析。这包括排队的动画。

如果您将回调函数直接传递给.fadeOut(),那么您将获得每个元素的回调,而不是在完成所有元素之后的回调

答案 1 :(得分: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();
    }
});