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;

この配列は条件でデータを取得しています。ハンドラ関数は、アップロードというボタンをクリックすると呼び出されます。問題は、[アップロード] ボタンを押すと正しい値が印刷され、押したままにして値を再度印刷することです。値を 2 回印刷するループを強制する私のコードに間違いはありますか?
または、他にこれを行っているものはありますか?

4

3 に答える 3

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 に答える
1

event.preventDefault()ボタンの発火を止めるために使用する必要があります。

于 2013-01-14T07:28:06.057 に答える
1

連想配列のように見えますが (hellow要素 ID と配列キーの両方であるため)、インデックス付き配列のようにアクセスしています。

したがって、代わりにこれを行う必要があります。

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