3

我正在使用 JavaScript。我有循环调用的问题。
我的代码是:

这是我的数组

picArray = []; // Have tried with this too var picArray = new Array();

这是我的 onClick 功能:

handler:function(){
    for(var i = 1; i<picArray.length; i++) {
        alert(picArray[i]);
    }
}

这是我打印数组中的值的循环。我的数组是:

var imgSource = document.getElementById(hellow).src;
picArray[hellow] = imgSource;

该数组正在获取有关条件的数据。处理程序函数在单击名为 Upload 的按钮时调用。问题是当我按下上传按钮时,它会打印正确的值并保持按下状态并再次打印值。我的代码中是否有任何错误迫使循环打印值 2 次?
或者其他什么在做这个?

4

3 回答 3

1

它看起来像一个关联数组(因为hellow它既是元素 ID 又是数组键),但您正在像索引数组一样访问它。

所以你应该这样做:

for (var key in picArray) {
    alert(picArray[key]);
}
于 2013-01-14T07:25:21.743 回答
1

您应该使用event.preventDefault()来阻止按钮触发。

于 2013-01-14T07:28:06.057 回答
1

我认为您应该考虑在单击按钮时使用闭包函数,以保留外部上下文的范围。我的假设是问题的根源在于这样一个事实,即当您进入循环条件时,只有在循环完成时才能获得最终值。

这个问题可以通过创建一个函数并在循环的每次迭代中调用它来解决,同时传递i; 调用该函数将形成一个全新的执行上下文,其中 i 的值被保留,并且可以在该上下文中以任何方式使用,包括在返回的函数中。

因为您没有发布其余代码,所以我只认为这是问题所在。为了解决这个问题,这是我将在此上下文中使用的代码:

function handler(n) {
    return function() {
        alert( 'You clicked on: ' + n );
    };
}

for (var i = 0; i < picArray.length; ++i) {
    picArray[i].onclick = handler(i);
}

...或另一种更优雅的方式:

for (var i = 0; i < picArray.length; ++i) {
    picArray[i].onclick = (function(n) {
        return function() {
            alert( 'You clicked on: ' + n );
        };
    })(i);
}
于 2013-01-14T08:38:18.103 回答