Google Maps API: не удается правильно загрузить данные информационного окна.

У меня есть этот код, который генерирует рынки, на которые я хочу кликнуть, с помощью всплывающего информационного окна.

for (i = 0; i < marker_array.length; i++) {
    var point = new GLatLng(marker_array[i][0], marker_array[i][1]);
    var marker = new GMarker(point, markerOptions);

    GEvent.addListener(marker, "click", function() {
        marker.openInfoWindowHtml(html_data);
        });
    map.addOverlay(marker);
    }

Проблема в том, что кликабельным становится только один рынок. Независимо от того, какой из них нажат, информационное окно с данными одного кликабельного маркера появляется над этим одним кликабельным маркером. Все маркеры загружаются и находятся в правильных местах, поэтому проблема заключается только в отображении данных всплывающего окна для каждого из них.

Я ознакомился с разделом о «развертывании» функции маркера здесь и, похоже, именно здесь Я ошибаюсь, но мне не удалось заставить это работать, протестировав предлагаемые ими изменения.


person Evan    schedule 13.12.2008    source источник
comment
каков источник html_data? Вы хотите, чтобы он был одинаковым для всех маркеров? потому что так работает ваш образец.   -  person lincolnk    schedule 27.10.2010


Ответы (4)


Я полагаю, ваша проблема в том, что переменная html_data одинакова для всех итераций этого цикла. Вы должны обновлять эту переменную каждый проход в цикле, чтобы значения были разными.

person Ranok    schedule 18.12.2008

Я не совсем уверен, понимаю ли я, но вы говорите, что все всплывающие окна содержат одни и те же данные?

Я думаю, что это проблема, и это связано с тем, как работают прослушиватели событий. Когда происходит функция щелчка, она оценивает событие прослушивателя. Таким образом, HTML, который вы показываете, всегда один и тот же, поскольку переменная всегда перезаписывается.

person Aaron Powell    schedule 13.12.2008
comment
Всплывающие окна генерируются только на одном из маркеров. Другими словами: когда я нажимаю на m1, данные m2 появляются поверх m2, когда я нажимаю на m2, данные m2 появляются поверх m2. - person Evan; 13.12.2008

Я использовал массив, который соответствует данным моего маркера для моего HTML, и он работает хорошо:

function createMarker(posn, title, icon, i) {
    var marker = new GMarker(posn, {title: title, icon: icon, draggable:false});
    GEvent.addListener(marker, 'mouseover', function() { 
        map.closeInfoWindow()
        marker.openInfoWindowHtml(infoText[i])

     } );   
    return marker;
}
person Diodeus - James MacFarlane    schedule 13.12.2008

Я нашел тот же случай, и у меня есть решение этой проблемы. Я предлагаю вам создать собственный класс, расширяющий класс Marker. В этом пользовательском классе вы должны создать конструктор с параметрами для ваших данных, и этот класс также должен иметь свою собственную переменную информационного окна, которая будет вызываться из вашего основного приложения. Например:

Пользовательский класс:

public class StoreSpot extends Marker
{  
    public var infoWindow:InfoWindowOptions;
    public var store_id:String;
    public var address:String;
    public var name:String;
    ...
}

Основное приложение:

tempMarker = new StoreSpot(
    tempLatlng,
    new MarkerOptions({
        icon:new spotStore(), 
        iconAlignment:MarkerOptions.ALIGN_HORIZONTAL_CENTER,
        iconOffset:new Point(0,-50)
    }),
    temp.store_id,
    temp.name,
    temp.address,
    temp.detail
);

Таким образом, вы можете разместить разные информационные окна для разных маркеров. Надеюсь, что это работает для вас. Введите код сюда.

person Garibaldy    schedule 29.11.2009