1

ループ内のマーカーにリスナーを追加しようとしていますが、機能しません。

それらを別々に追加すると機能します。このような:

    google.maps.event.addListener(markersArr[0], 'click', function() {
        infoWindowArr[0].disableAutoPan=true;
        infoWindowArr[0].open(map,markersArr[0]);
    });

    google.maps.event.addListener(markersArr[1], 'click', function() {
        infoWindowArr[1].disableAutoPan=true;
        infoWindowArr[1].open(map,markersArr[1]);
    });

ただし、ループに追加する場合、マーカーをクリックしても情報ウィンドウはポップアップしません。

        for (var u=0; u<2; u++){
             google.maps.event.addListener(markersArr[u], 'click', function() {
             infoWindowArr[u].disableAutoPan=true;
             infoWindowArr[u].open(map,markersArr[u]);
        });

ループで動作させる方法を誰かが説明できますか?

4

2 に答える 2

2

問題は、リスナー関数がu外部スコープで定義されている変数を参照し、関数の外部で変更されることです。つまり、リスナーの実行時にu == 2、ループがすでに終了しているため、リスナーが表示されます。

リスナーを別のクロージャーでラップすることができます。

function makeListener(index) {
    return function() {
        infoWindowArr[index].disableAutoPan=true;
        infoWindowArr[index].open(map,markersArr[index]);
    }
}

for (var u=0; u<2; u++){
    google.maps.event.addListener(markersArr[u], 'click', makeListener(u));
}
于 2012-06-01T14:17:33.697 に答える
1

も同じ状況で、エンジニアは無名関数ラッパーで答えました。このようになります。サイド関数を作成するよりもコンパクトですが、読みにくくなります。

    for (var u=0; u<2; u++){
      (function(u) {
         google.maps.event.addListener(markersArr[u], 'click', function() {
           infoWindowArr[u].disableAutoPan=true;
           infoWindowArr[u].open(map,markersArr[u]);
         });
      })(u);
    }
于 2012-06-01T14:21:45.333 に答える