13

Ich verwende Google Maps API v3 auf einer Website, die ich gerade entwickle. Ich habe eine Dropdown-Box unter meiner Karte, die es dem Benutzer ermöglicht, zwischen verschiedenen Gruppen von Markierungen zu wechseln, die auf der Karte angezeigt werden. Jeder Marker wird mit marker.setMap() angezeigt.Google Maps API v3: Gibt es einen Callback- oder Event-Listener für ein Ereignis setMap()?

Mein Problem ist, dass die Karte manchmal lange dauert, um die neuen Markierungen anzuzeigen, besonders im IE. Ich möchte eine "Lade" -Animation zeigen, während die Karte Marker wechselt. Aber ich weiß nicht, wie man erkennt, wenn die Karte die neuen Daten anzeigt (es gibt keine Seitenladung, da dies alles AJAX ist). Gibt es einen Callback- oder Event-Listener für ein setMap() -Ereignis, sodass ich eine Funktion aufrufen kann, um die "Lade" -Animation zu stoppen, wenn der letzte Marker geladen ist?

Antwort

21

Es scheint kein Callback oder Event-Listener für setMap() zu sein, aber ich habe einen Weg gefunden, um das zu erreichen, was ich wollte. Ich lade die Google Map mit jQuery. Hier ist mein Code.

Bei der Initialisierung der Karte habe ich einen Listener für das Ereignis 'idle' eingerichtet, in dem die "loading" -Animation ausgeblendet wird. Das ‚Leerlauf‘ Ereignis ausgelöst wird, wenn die Karte fertig ist nach einer Scroll- oder Zoomänderung neu gezeichnet:

google.maps.event.addListener(this.map, 'idle', function() { 
$('#loading').hide(); 
}); 

Und in meiner Funktion Overlays zu löschen, habe ich zunächst die Lade Animation zeigen, deaktivieren Sie dann jeden Marker setMap (null). Dann ändere ich die Karte sehr leicht, indem ich den Längengrad um .000000001 ändere. Dies geschieht nach dem Aufruf von setMap() und löst das Ereignis 'idle' aus, das die Ladeanimation verdeckt.

// clear overlays from the map 
function clearOverlays() { 
$('#loading').show(); 

// clear the markers from the active data array 
if (activeData) { 
    for (i in activeData) { activeData[i].setMap(null); } 
} 
activeData = ''; 

// very slightly recenter the map to trigger the 'idle' event 
var centerlat = MYMAP.map.getCenter().lat(); 
var centerlng = MYMAP.map.getCenter().lng() + .000000001; 
recenter = new google.maps.LatLng(centerlat, centerlng); 
MYMAP.map.setCenter(recenter); 
} 

Es ist ein bisschen wie ein Hack, aber ich hoffe, dass jemand anderes dies nützlich findet.

+2

Ja ich diese nützlichen –

+1

fand ich similir Sache zu erreichen versucht. Ich erstelle Preloader bei "Leerlauf" start, rendere dann Marker-Clusterer und wenn alle Clusterer und Marker gesetzt sind, verstecke ich den Preloader. Aber es hat nicht wie erwartet funktioniert. Preloader hat nicht gezeigt (in DOM ja, aber sofort verschwunden, nicht auf CSS). Dein Hack hat meinen Tag gerettet. – exoslav