2012-05-04 120 views
1

我想根據其高度對列中的某些圖像進行排序,並且我有以下代碼。 問題是即使imgHeights.length工作正常,imgHeights [i](在redrawThumbs函數中)不會返回值。 我做錯了什麼?感謝=)JavaScript無法從函數的數組參數中獲取值

function redrawThumbs(imgHeights){ 
    // some irrelevant code here 

    // initialise an array that will hold all the column's heights 
    var colHeights = new Array(cols); 
    for(a=0; a <= colHeights.length - 1; ++a){ 
    colHeights[a] = 0; 
    } 

    // take each image's height and add it to the shortest column 
    for(i=0; i <= imgHeights.length - 1; ++i){ 
    var shortestCol = 0; 

    for(c=0; c <= colHeights.length - 2; ++c){ 
     if(colHeights[c+1] < colHeights[c]){ 
     shortestCol = colHeights[c+1]; 
     } 
    } 

    alert("imgHeights[" + i + "] " + imgHeights[i]); 

    colHeights[shortestCol] += imgHeights[i]; 
    } 
} 

// make an array of image heights 
var imgHeights = new Array(totalThumbs);  
for(i=1; i <= totalThumbs; ++i){ 
    var img = new Image(); 
    img.onload = function(){ 
    imgHeights[i-1] = this.height; 
} 
img.src = i + ".jpg"; 

// call function that orders the images 
redrawThumbs(imgHeights); 
+0

您可能想要在代碼中添加縮進,並添加缺少的}。很難判斷你的'redrawThumbs()'方法在哪裏結束。 – jaredhoyt

+0

我加了缺少的}。 indentation ... 2空間不是那樣的小代碼不好:D 我剛纔注意到最怪異的事情,而調試是底部爲我在哪裏創建imgHeights陣列,以及我把一個警報在那裏打印我的變量和它總是顯示循環的最後一個數字。我不知道爲什麼會發生這種情況,因爲它使用它創建元素時工作正常 –

回答

0

的問題之一是,i變量通過引用捕獲,而不是由值,因此,對於所有img.onload回調越來越的i相同的值。考慮改變onload分配,

var loadedCount = 0; 
img.onload = (function (i) { 
    return function() { 
     imgHeights[i - 1] = this.height; 
     if (++loadedCount == totalThumbs) allLoaded(); 
    }; 
})(i); 

function allLoaded() { 
    // called after all the images have been loaded. 
} 

這抓住了i值的副本,在自動執行功能執行點和所有的圖像都被加載後調用allLoaded()

+0

我試過了,並添加了一個alert(alert)(imgHeight [i - 1]);下面的代碼,但它甚至不出現。我做錯了嗎?我如何驗證值 也許我已經是一個變量是搞亂它是一個函數名? –

+0

如果我從字面上理解代碼,則需要爲圖像添加一個'src'屬性。而且,在調用'redrawThumbs()'後,回調將發生。 – chuckj

+0

啊imgHeights中缺少一個「s」。現在警報出現了,但是當我嘗試打印imgHeights的內容時(我在外部和此循環之後創建了一個新循環),我仍未獲取undefined –