2012-05-04 196 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 –