2011-07-06 10 views
0

私はすべてのマーカーをメーカーの配列に保存しています。マーカーをクリックすると、配列からインデックスを取得したいと思います。しかし、これは正しいインデックスで私を返しません、代わりにそれは最大インデックスを返します。なにか提案を?Google map API2 addListener

for(var i = 0; i<options.length; i++){ 
marker[i] = new GMarker(new GLatLng(options[i].latitude, options[i].longitude), markerIcon); 
//addListener(i, options[i].name); 
GEvent.addListener(marker[i],"click", function(e) { 
alert(i); 
}); 
map.addOverlay(marker[i]); 
} 

答えて

1

問題は、あなたが期待するように変数iは、閉鎖に捕獲されていないことです。したがって、すべてのリスナーは同じiをキャプチャしています(最終的にoptions.lengthにインクリメントされます)。マーカー/リスナーの作成を独自の関数でラップする必要があります。

var makeNewMarker = function(i) { 
    var marker = new GMarker(
     new GLatLng(options[i].latitude, options[i].longitude), 
     markerIcon); 
    GEvent.addListener(marker[i],"click", function(e) { 
    alert(i); 
    }); 
}; 
for (var i = 0; i < options.length; ++i) { 
    marker[i] = makeNewMarker(i); 
    map.addOverlay(marker[i]); 
} 

あなたはmakeNewMarker機能にforループ内の無名関数を作ることができますが、この方法は、より読みやすいようです。

+0

ありがとう、Dave!私の日を救った。 –