2012-05-07 101 views
0

我有这个功能与关闭工作在JavaScript

function createSlidingGallery(){ 
    gallery_position = parseInt(jQuery(".imageWrapper.default").attr("rel")); 
    gallery_position_min = 0; 
    gallery_position_max = parseInt(jQuery("#galleryEl .sig_thumb a").size() - 1); 
    var galleryWrapper = document.createElement("div"); 
    galleryWrapper.className = "sGalleryWrapper"; 
    for (var i = 0; i < gallery_position_max; i++) { 
     var slide = document.createElement("div"); 
     slide.className = "slide slide"+(i); 
     slide.setAttribute('rel', i); 
     galleryWrapper.appendChild(slide); 
    }; 
    jQuery(".imageWrapper.top").append(galleryWrapper); 


//HERE COMES THE PROBLEM PART 

    for (var i = 0; i < gallery_position_max; i++) { 
     var position = i; 

//THE CALLBACK ACTUALLY USES THE SAME CONTEXT FOR ALL PARTICULAR CALLS SO THAT THE POSITION VALUE HOLDS THE MAXIMUM VALUE IN ALL INSTANCES 

     loadImage(position, false, function(index){ 
      console.log(index); 
      jQuery(".slide"+position).css({ 
       'background': 'url('+backgroundImages[index].src+')' 
      }); 

     }); 
    }; 
    hideLoadingDC(); 


} 

它应该做的是异步加载图片到dynamicaly创建的元素。它实际上创建了所有元素,并且它也加载了图像。但有一个称为loadImage的函数,用于预加载图像,然后保存这些图像已经加载并且可以缓存的信息。我用回调函数调用它来处理加载的图像,并将其设置为适当元素的背景。因此,我需要保存有关元素的信息(如指针或索引/位置)。 现在我试图将它的索引传播给函数,但是因为回调函数在一段时间后被调用,位置变量已经具有其他值(for循环实际上经过并且在回调的所有调用中它被设置为最大值值)

我知道我可以改变loadImage函数并添加位置作为另一个属性,但我会优先考虑任何其他解决方案。我不想改变loadImage函数。

+4

经典功能-IN-A环/闭合问题。这个问题的一个变种至少每天在这里问。 –

回答

2

您可以使用一个辅助功能,为position变量创建一个新的范围:

function makeGalleryCallback(position) { 
    return function(index){ 
     console.log(index); 
     jQuery(".slide"+position).css({ 
       'background': 'url('+backgroundImages[index].src+')' 
      }); 
     }; 
} 

function createSlidingGallery(){ 
    ... 
    for (var i = 0; i < gallery_position_max; i++) { 
     loadImage(i, false, makeGalleryCallback(i)); 
    } 
    ... 
} 
2

的问题是,所有的回调函数都引用相同的I值,并在没有实际跟踪的价值迭代时间。所以,你需要创建一个新的范围(闭包),为每个不同的i值创建一个新的引用。

一个新的作用域可以用JS创建一个函数。您的代码需要使用匿名函数进行包装,并为i的每个不同值执行该函数。

for (var i = 0; i < gallery_position_max; i++) { 
    var position = i; 
    loadImage(position, false, (function(index){ 
     return function(){ 
     console.log(index); 
     jQuery(".slide"+position).css({ 
      'background': 'url('+backgroundImages[index].src+')' 
     }); 
     };})(i)); 
}; 

+0

实际上,这是我一直在等待的解决方案:)我已经接受了下面的答案,因为它也在工作。谢谢 – simekadam

+0

@Sima:你可以改变接受的答案,你知道,如果你想要 – newacct