2010-07-29 2 views
29

Gibt es eine Möglichkeit, zu verhindern, dass eine Google Maps (JS, v3) -Karte von Anfang an angezeigt wird? Ich mache eine Vorverarbeitung und möchte meinen "Loading" -Spinner zeigen, bis alles gut geht (eloquenter ausgedrückt, verstecke die Karte - zB den Container div - bis die gesamte Vorverarbeitung abgeschlossen ist - an welchem ​​Punkt , zeige die Karte).Eine Karte von Google Maps v3 versteckt halten und bei Bedarf anzeigen

Das Verbinden des idle Ereignisses der Karte hilft nicht viel, da die Karte bereits angezeigt wird, wenn dieses Ereignis eintritt.

Ich weiß, dass der Behälter div durch GMaps nach dem Laden Inline-Stil bekommt, meine erste Idee, das style Attribut (beim Hören auf die idle Ereignis) zu räumen, aber es wäre interessant zu sehen, ob es einen Weg gibt, die Karte zu erstellen und nicht anzuzeigen, bis die gesamte Vorverarbeitung abgeschlossen ist.

Vielleicht mithilfe eines Arguments zum new google.maps.Map Konstruktor oder MapOption?

Irgendwelche Gedanken dazu?

Vielen Dank im Voraus!

+3

arbeiten werde ich ein $ benutzt habe ("# map_canvas "). attr (" Stil "," Position: Relativ; Sichtbarkeit: Versteckt ") Trick, funktioniert. – Dr1Ku

+3

Wie Dr1Ku sagt. Rendern Sie die Map in ein unsichtbares Div und zeigen Sie das Div im ersten Idle-Event an. Stellen Sie sicher, dass Sie addListenerOnce verwenden. – CrazyEnigma

Antwort

67

Denken Sie auch daran nennen:

google.maps.event.trigger(map, 'resize'); 

wenn Sie die Größe des <div> geändert haben. A display:none<div> hat keine Größe.

+3

Das war nur eine Teillösung für mich. Ich musste auch 'map.fitBounds (bounds);} aufrufen, wobei bounds das richtige LatLngBounds-Objekt war. – matt

+0

Danke! Es hat funktioniert wie ein Zauber! – aakashbhowmick

+1

Zusätzlich zu dem, was matt gesagt wurde, können Sie 'panTo (location)' verwenden, um die Karte neu zu zentrieren. – dtanders

1

besseren Weg:

gmap.redraw = function() { 
    gmOnLoad = true; 
    if(gmOnLoad) { 
     google.maps.event.trigger(gmap, "resize"); 
     gmap.setCenter(gmlatlng); 
     gmOnLoad = false; 
    } 
} 

und in Show Click-Ereignis:

$("#goo").click(function() { 
    if ($("#map_canvas").css("display") == "none") { 
    $("#YMapsID").toggle(); 
    $("#map_canvas").toggle(); 
    if (gmap != undefined) { 
     gmap.redraw(); 
    } 
    } 
}); 
+0

Sieht gut aus, danke für die Eingabe! – Dr1Ku

+0

Ich dachte, dass diese vorübergehende Lösung besser als nichts ist. –

1

je nachdem, was Sie einen anderen posibility tun mehrere bools Sie auf true gesetzt haben könnte, wenn jeder Vorgang abgeschlossen ist .

Zum Beispiel:

, wenn Sie einen geocode Dienst ausgeführt haben, die Sie warten möchten, können Sie ein var GeoState

und im Ergebnis ein Teil der Geocoder Satz GeoState auf true genannt haben, dann haben eine zeitgesteuerte Funktion überprüfen, ob alle Dienste True zurückgegeben haben, wenn sie haben, machen Sie die Karte sichtbar.

4

Das funktioniert für mich. Ich benutze die JQuery-Bibliothek.

+0

Hey Gabriel. Danke für diese erstaunlich einfache und effektive Lösung. Klappt wunderbar! – Enes

+0

Bitte beachten Sie, dass dies die Karte wahrscheinlich jedes Mal neu lädt, und mit Maps API v3 gibt es eine tägliche Beschränkung, wie oft Sie das Kartenelement laden dürfen. – Simon

5

Oder Sie könnten es einfach wie mit css visablility oder css Opazität verstecken.

$("#GoogleMap").css({ opacity: 0, zoom: 0 }); 
initialize(); 

google.maps.event.addListener(map,"idle", function(){ 
    $('#Loader').hide(); 
    $("#GoogleMap").css({ opacity: 1, zoom: 1 }); 
}); 
+0

Opazität: 0 hat den Trick gemacht, ich habe versucht, anzuzeigen: keine, und hatte keine guten Ergebnisse –

2

Diese

google.maps.event.addListener(map, "idle", function() 
    { 
     google.maps.event.trigger(map, 'resize'); 
    });