0

ループ内で実行される addListener 関数に変数を取得しようとしていますが、常にループ変数の最後のインスタンスにのみ注目します。

例えば

for(var i=0; i < data.length; i++) {
    points[i] = new google.maps.LatLng(parseFloat(data[i].lat), parseFloat(data[i].lng));
    gmarkers[i] = new google.maps.Marker({
        map: map,
        position: points[i],
        title: locationdata[i].title
    });
    gmarkers[i].setMap(map);
    bubbles[i] = new google.maps.InfoWindow({
        content: locationdata[i].summary
    });
    google.maps.event.addListener(gmarkers[i], 'click', function() {
        alert(i);
        bubbles[i].open(map, gmarkers[i]);
    });
}

したがって、問題は、alert(i) が常に data.length の最後の項目であることです。これは理にかなっていますが、これを修正する方法がわかりません。


ロケットはこの質問に答えて正解でしたが、構文が少しずれていたので、後でこれに出くわした人のために実際の構文をここに投稿します。

google.maps.event.addListener(gmarkers[i], 'click', (function(i) {
    return function() {
        alert(i);
        bubbles[i].open(map, gmarkers[i]);
    }})
(i));
4

3 に答える 3

1

これは JavaScript の典型的な問題です。リスナーごとにクロージャーを作成する必要があります。

google.maps.event.addListener(gmarkers[i], 'click', (function(i) {
    return function(){
        alert(i);
        bubbles[i].open(map, gmarkers[i]);
    };
})(i));
于 2012-04-19T15:56:19.753 に答える
0

これを行う別の方法は、addListener 関数を別の関数に入れ、それをループで呼び出すことです。ロケットが彼の答えで言ったように、それを理解していないと大きな問題になる可能性がある閉鎖の問題です。私がそうしていると言っているわけではありませんが、いくつかのことを試しましたが、次のような別の方法を使用する方が気に入っています。

function addEventListener(i){
    google.maps.event.addListener(gmarkers[i], 'click', function() {
        alert(i);
        bubbles[i].open(map, gmarkers[i]);
    });
}

しかし、それは個人的な好みの問題です。他のオプションも投入すると思いました:)

于 2012-04-19T18:43:54.787 に答える
0

Frame.jsが解決するために設計されたもう 1 つの問題です。Frame を使用した、より読みやすくスケーラブルなソリューションを次に示します。

for(var i=0; i < data.length; i++) {
    Frame(function(next, i){
        google.maps.event.addListener(gmarkers[i], 'click', function() {
            alert(i);
        });
        next();
    }, i);
}
Frame.init();
于 2012-04-19T16:17:42.683 に答える