2011-07-06 4 views
1

assemblyElは正しく作成されますが(1.jpg、2.jpg、3.jpg)、ajaxリクエストは常に最後のid(3)を送信します。いつもオブジェクトへの最後の参照がループで使われるのはなぜですか?

なぜこれが起こり、修正するのか?

var assemblies = [{id:1},{id:2},{id:3}]; 

for (var a in assemblies) { 
    var assembly = assemblies[a]; 

    var assemblyEl = $('<img src="' + assembly.id + '.jpg" />') 
         .click(function() { 
           $.ajax({ 
            type: "POST", 
            url: url, 
            data: { id: assembly.id }, 
            async: false, 
            success: function (data) { 
            } 
           }); 
         }); 
} 
+0

アセンブリはこの形式でなければなりませんか? – Ibu

+0

待って、あなたはid 3を送ろうとは思わないのですか? – Ibu

+1

配列の 'for ... in'ループの使用をやめてください。彼らは遅く、不安定です。 –

答えて

1

要素がクリックされたときにクリックイベントが発生するためです。そのときまでに、assemblyの値がループの最後の値になります。

クロージャを使用して、値を新しいスコープにコピーします。

function clickHandler(assembly) { 
    return function() { 
     $.ajax({ 
       type: "POST", 
       url: url, 
       data: { id: assembly.id }, 
       async: false, 
       success: function (data) { 
       } 
      }); 
    }; 
} 

.click(clickHandler(assembly)); 
+0

しかし、要素の作成後に「クリック」が発生する – theateist

+0

次のようなこともできます:http://stackoverflow.com/questions/2192348/closures-in-a-for-loop内部的にはクロージャーも作られています。 – Arxisos

関連する問題