2012-05-07 100 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