0

GoogleマップのAPIを使用しています。マーカーの配列と情報ウィンドウの配列があり、マーカーがクリックされたときにそれぞれの情報ウィンドウを表示しようとしています。JavaScriptクロージャを尊重するように、イベントリスナーを追加する方法を理解するのに苦労しています。

(不正解)コード。これらはすべてinitialize()、ページの読み込み時に呼び出されるに含まれています。

var markers = []
var infoWindows = []

[define all markers and info windows here, long so cut]

for (var i = 0; i < markers.length; i++)
{
    google.maps.event.addListener(markers[i], 'click', function() {
        infoWindows[i].open(mymap, markers[i]);
    });
}

ここに来る前に、すべてのオブジェクトが正しく初期化されていることを確認しました。

私の問題についての私の理解は、クリックイベントが発生するまでに、infoWindows[i]アクセスできなくなるということです。配列のi番目の位置のがi番目の位置のマーカーに対応するeventListener場合に、私が思うように機能するように、これについて何ができますか?infoWindow

4

1 に答える 1

1

の値が更新されたため、アクセスinfoWindows[i]できなくなりました。i

これを解決する1つの方法は、次を使用すること.forEachです。

markers.forEach(function(value, i){
    google.maps.event.addListener(markers[i], 'click', function() {
        infoWindows[i].open(mymap, markers[i]);
    });
})

この場合、各イベントリスナーのi変数は異なる関数にあります。現在のコードはi毎回同じ変数を使用しi、すべてのイベントリスナーの変数は同じです。すべてのイベントリスナーが割り当てられた後もi、最終的な値のままでmarkers[i]、リストの最後のマーカーを参照します。

別の解決策については、この質問を確認してください。

于 2013-03-20T20:02:28.857 に答える