0

すべてのマーカーを maker 配列に保存しました。マーカーをクリックすると、配列からインデックスを取得したいと思います。ただし、これは正しいインデックスを返さず、代わりに最大インデックスを返します。なにか提案を?

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]);
}
4

1 に答える 1

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 ループ内で無名関数にすることもできますが、この方法の方が読みやすいようです。

于 2012-02-20T23:55:19.630 に答える