2009-05-24 2 views
0
var thumbs = document.getElementsByTagName("img"); 
    for (var i=0; i<thumbs.length; i++) 
    { 
     Core.addEventListener(thumbs[i], "click", function() {alert(i);}); 
    } 

上記のコードでは、警告は常に18と表示されます。これは画像サムネイルの数です。どのサムネイルをクリックしたかを表示したい。なぜそれを示していないのですか? また、クリックしたサムネイルの値を別の関数に渡す必要があります。そのため、後続のフルイメージも表示できます。 誰でも助けてくれる?イメージギャラリーループJS

これを行うにはさらに良い方法がある場合は、plsが提案します。 ありがとうございます。

答えて

0

これは、内部の匿名関数が変数iを閉じるため、常に反復の最後の値が表示されるためです。あなたは、次の操作を行います。

Core.addEventListener(thumbs[i], "click", (function(j) 
              { 
               return function() 
                 { 
                 alert(j); 
                 }; 
              })(i)); 

説明:あなたのコードで

反復変数iは、イベントハンドラの生成内側の無名関数のグローバル変数のようなものですが、が、あなたが作成するように思えることに注意しなければなりません異なる匿名関数を使用していますが、それらのすべてがよりグローバルな範囲で見ていますが、それはすべて同じものです。最後の値は警告されます。これを避けるために、別のラッパー関数を作成して、別の範囲内にiの値を囲んで別の要素に別の警告が表示されるようにします。コメントの説明も正しいです、私はJavascriptのクロージャーについてGoogleに助言し、それについてのいくつかの記事を読んでください。

+0

これが機能しました。上記のコードが何をしているのかをplsで説明できますか? – amit

+1

関数の周りに「クロージャ」をラップします。変数jを "閉じる"という無名関数を定義しています(変更することはありません)。この関数は関数(イベントハンドラの 'alert')を返します。この無名関数は、(i)を引数として呼び出され、実行時にj == iとなります。 – gnarf

+0

イェップ、上記の説明は非常に詳細です。 –