以下面的代码为例,我想传递价值' i'到回调函数,以便它将从正确的div中删除该类。目前,这只是将我视为循环中的最后一个值。
for(i=0;i<tablelength;i++){
if($('#detailsdiv'+i).is(':visible')){
$('#anotherdiv'+i).slideUp('slow',function(){
$('#div'+i).removeClass('open');
});
}
答案 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;目前设置了回调。