создание маркеров в цикле - Infowindow не открывается, когда внутри слушателя щелчка - PullRequest
2 голосов
/ 30 ноября 2011

У меня есть карта Google с несколькими маркерами, и у каждого есть собственное информационное окно.

при нажатии ничего не происходит.К вашему сведению: я знаю, что слушатель срабатывает, потому что я поставил предупреждение раньше, и это сработало.

Код проблемы:

google.maps.event.addListener(point[i], 'click', function() {
     infowindow[i] = new google.maps.InfoWindow({content: contentString[i] });
     infowindow[i].open(map,point[i]);
});

, если я только делаю

     infowindow[i] = new google.maps.InfoWindow({content: contentString[i] });
     infowindow[i].open(map,point[i]);

это работает.но не в моей функции addListener.Я думаю, что это то, что googlemaps не нравится, но Firebug дает мне 0 ошибок ..

действительно нужна ваша помощь.Большое спасибо!

Ответы [ 2 ]

4 голосов
/ 30 ноября 2011

Это потому, что у вас, вероятно, есть замыкание в цикле!Таким образом, переменная i в обратном вызове уже перезаписывается в момент вызова обратного вызова.У вас есть два варианта, как это исправить:

1) классический обходной путь "замыкания в цикле" (вы делаете другое закрытие для каждой итерации цикла):

for (i = 0; i < 20; i++) { (function  (i) {
    google.maps.event.addListener(point[i], 'click', function() {
         infowindow[i] = new google.maps.InfoWindow({content: contentString[i] });
         infowindow[i].open(map,point[i]);
    });
})(i);
}

2) избегайте замыкания и используйтеструктура данных маркера:

for (i = 0; i < 20; i++) {
    point[i].i = i;
    google.maps.event.addListener(point[i], 'click', function() {
         this.myinfowindow = new google.maps.InfoWindow({content: contentString[this.i] });
         this.myinfowindow.open(map, this);
    });
}

(или вы также можете переместить contentString также к маркеру: point[i].contentString = ... и использовать this.contentString в обработчике кликов. Тогда вам не нужен point[i].iатрибут.)

Лично я гораздо больше предпочитаю второе решение, чем первое, поскольку замыкания потребляют память и т. д.

0 голосов
/ 30 ноября 2011

У меня та же проблема, и она как-то связана с циклом, потому что когда я использую жестко закодированные значения, как это, они работают:

                // Add infowindow
                google.maps.event.addListener(markers[0], 'click', function() {
                  infowindows[0].open(map,markers[0]);
                });
                // Add infowindow
                google.maps.event.addListener(markers[1], 'click', function() {
                  infowindows[1].open(map,markers[1]);
                });
...