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);
    }

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

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

4 ответа

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

Я использовал массив, который соответствует моим данным маркера для моего 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;
}

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

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

Я нашел такой же случай, и у меня есть решение этой проблемы. Я предлагаю вам создать собственный класс, расширяющий класс 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
);

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

Другие вопросы по тегам