У меня есть карта Google, на которой показано несколько маркеров. Когда пользователь перемещает карту, маркеры перерисовываются для новых границ, используя код ниже:
GEvent.addListener(map, "moveend", function() {
var newBounds = map.getBounds();
for(var i = 0; i < places_json.places.length ; i++) {
// if marker is within the new bounds then do...
var latlng = new GLatLng(places_json.places[i].lat, places_json.places[i].lon);
var html = "blah";
var marker = createMarker(latlng, html);
map.addOverlay(marker);
}
});
Мой вопрос прост. Если пользователь нажал на маркер, чтобы он показывал открытое информационное окно, в настоящее время, когда границы перерисовываются, информационное окно закрывается, потому что маркер добавляется снова с нуля. Как я могу предотвратить это?
Это не идеально, потому что часто границы перерисовываются, когда пользователь нажимает на маркер и карта перемещается, чтобы отобразить информационное окно - поэтому информационное окно появляется и затем снова исчезает:)
Я думаю, есть несколько возможных способов:
- запомните, у какого маркера есть открытое информационное окно, и откройте его снова, когда маркеры будут перерисованы
- на самом деле не добавляйте маркер с открытым информационным окном, просто оставьте его там
Однако оба требуют, чтобы маркер с открытым окном имел какой-то идентификационный номер, и я не знаю, что это на самом деле так в API Карт Google. Кто-нибудь? * * 1016
---------- UPDATE ------------------
Я попытался сделать это, загрузив маркеры в исходный массив, как это было предложено. Это загружается нормально, но страница падает после перетаскивания карты.
<script type="text/javascript" src="{{ MEDIA_URL }}js/markerclusterer.js"></script>
<script type='text/javascript'>
function createMarker(point,html, hideMarker) {
//alert('createMarker');
var icon = new GIcon(G_DEFAULT_ICON);
icon.image = "http://chart.apis.google.com/chart?cht=mm&chs=24x32&chco=FFFFFF,008CFF,000000&ext=.png";
var tmpMarker = new GMarker(point, {icon: icon, hide: hideMarker});
GEvent.addListener(tmpMarker, "click", function() {
tmpMarker.openInfoWindowHtml(html);
});
return tmpMarker;
}
var map = new GMap2(document.getElementById("map_canvas"));
map.addControl(new GSmallMapControl());
var mapLatLng = new GLatLng({{ place.lat }}, {{ place.lon }});
map.setCenter(mapLatLng, 12);
map.addOverlay(new GMarker(mapLatLng));
// load initial markers from json array
var markers = [];
var initialBounds = map.getBounds();
for(var i = 0; i < places_json.places.length ; i++) {
var latlng = new GLatLng(places_json.places[i].lat, places_json.places[i].lon);
var html = "<strong><a href='/place/" + places_json.places[i].placesidx + "/" + places_json.places[i].area + "'>" + places_json.places[i].area + "</a></strong><br/>" + places_json.places[i].county;
var hideMarker = true;
if((initialBounds.getSouthWest().lat() < places_json.places[i].lat) && (places_json.places[i].lat < initialBounds.getNorthEast().lat()) && (initialBounds.getSouthWest().lng() < places_json.places[i].lon) && (places_json.places[i].lon < initialBounds.getNorthEast().lng()) && (places_json.places[i].placesidx != {{ place.placesidx }})) {
hideMarker = false;
}
var marker = createMarker(latlng, html, hideMarker);
markers.push(marker);
}
var markerCluster = new MarkerClusterer(map, markers, {maxZoom: 11});
</script>