将循环计数值传递给JQuery SlideUp Callback

时间:2014-03-12 15:10:08

标签: javascript jquery

以下面的代码为例,我想传递价值' i'到回调函数,以便它将从正确的div中删除该类。目前,这只是将我视为循环中的最后一个值。

for(i=0;i<tablelength;i++){
    if($('#detailsdiv'+i).is(':visible')){
        $('#anotherdiv'+i).slideUp('slow',function(){
        $('#div'+i).removeClass('open');
    });
}

2 个答案:

答案 0 :(得分:2)

之所以发生这种情况非常简单:在上滑功能返回并调用回调之前需要一些时间。鉴于此事实,此类型的函数调用是非阻塞的,for循环将快速到达最后一个值,并且所有回调将引用最后i值。

请改为尝试:

for (index=0; index < tablelength; index++) {
    (function(i) {
        if ($('#detailsdiv' + i).is(':visible')) {
            $('#anotherdiv' + i).slideUp('slow', function() {
                $('#div' + i).removeClass('open');
            });
        }
    })(index);
}

这样,我们创建一个函数,使用一个新的作用域立即调用它来保存我们的变量。使用我们的for循环迭代器index参数调用每个函数,并在其中使用i变量。

答案 1 :(得分:1)

你需要这样做:

for(i=0;i<tablelength;i++){
    if($('#detailsdiv'+i).is(':visible')){
        (function(i){
            $('#anotherdiv'+i).slideUp('slow',function(){
            $('#div'+i).removeClass('open');
        })(i);
    });
}

这是因为&#34; i&#34;你在slideUp的回调中使用的将引用for循环调用的所有幻灯片中的相同变量。这个&#34;我&#34;当然,在循环执行后会有最后一次迭代的值。

使用像这样的IIFE(立即调用函数表达式)将捕获&#34; i&#34;目前设置了回调。