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
);
Таким образом, вы можете разместить другое информационное окно для другого маркера. Надеюсь, что это работает для вас. Введите код сюда.