2017-02-01 9 views
1

とのforループを使用して、未定義のプロパティ「SRC」を読み込めません、私はこのコードを使用しています:は、コールバック

function init(){ 
     var s = document.getElementsByClassName("seen"); 
     for(var i = 0; i < s.length; i++) tint(image_seen, 93, 196, 82, 255, function(d){ 
      s[i].src = d; 
     }); 
    } 

をクラス名と画像のためのデータのURLを設定します。関数tint()は画像に色を付けるために値を返しません。コールバックを使用してキャンバスに描画する必要があります。しかし、私はそれがsrcのプロパティを未定義に設定することができないというエラーを受け取ります。 console.log(i)は常に1を返します。 (合計で1 img.seen個の要素があります)。

これは私を狂ってしまう。どうしましたか?

+1

検索すると、これはおそらくJSのfor-loopsに関する#1の質問です。 – dandavis

+0

すべての関数が同じ変数を参照し、forループの最後にこの変数は 's.length'に等しくなります。これを処理するためにクロージャを使用します。詳細についてはこちらを見てください - http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example –

答えて

0

問題は、同期for-loop内で非同期アクションが発生していることです。その結果、i1にインクリメントされ、tintでもコールバックにsrcの値が返されます。したがって、コールバック内のs[i]s[1]となります。これは確かにundefinedです。 (sは単一の要素を保持します)

ループも非同期であるforEachを試してみてください。

function init() { 
    var seen = document.getElementsByClassName('seen'); 
    [].forEach.call(seen, function(img) { 
     tint(image_seen, 93, 196, 82, 255, function(source) { 
     img.src = source; 
     }); 
    }); 
} 

私はimage_seeninit関数の外側の範囲に定義された変数であると仮定する。

+0

seen.forEach()は関数ではありません –

+0

@WearyAdventurer私の悪いです。 'getElementsByClassName'は配列ではなく' HTMLCollection'を返します。私の更新された答えを試してください。 –