2010-07-29 10 views
29

Czy istnieje sposób zapobiegania wyświetlaniu mapy Google Maps (JS, v3) od samego początku? Robię pewne wstępne przetwarzanie i chciałbym pokazać moje "ładowanie" spinnera, dopóki wszystko nie pójdzie dobrze (bardziej wymownie umieścić, ukryć mapę - np. Pojemnik div - do zakończenia całego przetwarzania wstępnego - w którym momencie , pokaż mapę).Zachowaj ukrytą mapę Google Maps v3, pokaż w razie potrzeby

Podejście do zdarzenia na mapie idle nie pomaga tak bardzo, ponieważ mapa jest już wyświetlana po trafieniu tego zdarzenia.

wiem, że pojemnik div dostaje inline tytułowana przez GMaps po załadunku, moim pierwszym pomysłem było usunąć atrybut style (podczas słuchania przypadku idle), ale byłoby interesujące zobaczyć, czy istnieje sposób, tworzenia mapy i jej wyświetlania dopiero po zakończeniu wstępnego przetwarzania.

Może za pomocą argumentu do konstruktora new google.maps.Map lub MapOption?

Jakieś przemyślenia na ten temat?

Z góry dziękuję!

+3

Użyłem $ ("# map_canvas "). attr (" styl "," pozycja: względna; widoczność: ukryta ") podstęp, działa. – Dr1Ku

+3

Jak mówi Dr1Ku. Odwzoruj mapę na niewidoczny element div, a następnie pokaż element div na pierwszym bezczynnym wydarzeniu. Pamiętaj, aby użyć metody addListenerOnce. – CrazyEnigma

Odpowiedz

67

Należy również pamiętać, aby zadzwonić:

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

jeśli uległy zmianie rozmiaru <div>. A display:none<div> nie ma rozmiaru.

+3

To było tylko częściowe rozwiązanie dla mnie. Musiałem również wywołać 'map.fitBounds (bounds);' gdzie bound był właściwym obiektem LatLngBounds. – matt

+0

Dzięki! To działało jak czar! – aakashbhowmick

+1

Oprócz tego, co powiedział matt, możesz użyć 'panTo (location)', aby ponownie wyśrodkować mapę. – dtanders

1

lepszy sposób:

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

i show-click imprezy:

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

Wygląda dobrze, dzięki za wejście! – Dr1Ku

+0

Myślałem, że to tymczasowe rozwiązanie jest lepsze niż nic. –

1

w zależności od tego, co robisz kolejny posibility może być posiadanie wielu bools ustawione na true, gdy każdy proces odbywa .

Na przykład:

jeśli masz uruchomiony serwis geocode którego chcesz czekać, możesz mieć var ​​nazywa GeoState

i w części wynikowej zbioru geocoder GeoState true, następnie sprawdź funkcję, czy wszystkie usługi powróciły do ​​stanu true, gdy mają, sprawiają, że mapa jest widoczna.

4

To działa dla mnie. Używam biblioteki JQuery.

$(document).ready(function(){ 
    $('#Checkbox').click(function(){ 
     $('#googleMapDiv').toggle(); 
     initialize(); // initialize the map 
    }); 
}); 
+0

Hej Gabriel. Dzięki za to niezwykle proste i skuteczne rozwiązanie. Działa jak marzenie! – Enes

+0

Należy pamiętać, że to prawdopodobnie przeładuje mapę za każdym razem, a przy API map V3 jest dzienny limit, ile razy można załadować element mapy. – Simon

5

Lub możesz po prostu ukryć to jak z css visablility lub css nieprzezroczystości.

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

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

krycie: 0 wykonał lewę, próbowałem wyświetlić: brak i nie dało to dobrych wyników –

2

To będzie działać

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