2010-07-29 4 views
29

¿Hay alguna manera de evitar que se muestre un mapa de Google Maps (JS, v3) desde el principio? Estoy haciendo un preprocesamiento y me gustaría mostrar mi spinner 'Loading' hasta que todo esté listo (más elocuentemente, oculte el mapa, por ejemplo, el contenedor div) hasta que se complete todo el procesamiento previo, y en ese momento , muestra el mapa).Mantener un mapa de Google Maps v3 oculto, mostrar cuando sea necesario

Conectar el evento idle del mapa no ayuda mucho, ya que el mapa ya se muestra cuando se produce este evento.

sé que el contenedor div pone en línea labrado por GMaps después de la carga, mi primera idea era limpiar el atributo style (mientras escucha el evento idle), pero sería interesante ver si hay una manera de crear el mapa y no mostrarlo hasta que se complete todo el procesamiento previo.

¿Quizás usando un argumento para el constructor new google.maps.Map, o un MapOption?

¿Alguna idea de esto?

¡Gracias de antemano!

+3

He usado un $ ("# map_canvas "). attr (" estilo "," posición: relativa; visibilidad: oculta ") truco, funciona. – Dr1Ku

+3

Como dice Dr1Ku. Renderice el Mapa a un div invisible, luego muestre el div en el primer evento inactivo. Asegúrese de usar addListenerOnce. – CrazyEnigma

Respuesta

67

Asimismo, recuerda a llamar:

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

si ha cambiado el tamaño de la <div>. A display:none<div> no tiene talla.

+3

Esto fue solo una solución parcial para mí. También tuve que llamar a 'map.fitBounds (bounds);' where bounds era el objeto LatLngBounds apropiado. – matt

+0

Gracias! Funcionó a las mil maravillas ! – aakashbhowmick

+1

Además de lo que dijo matt, puede usar 'panTo (location)' para volver a centrar el mapa. – dtanders

1

mejor manera:

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

y en el programa de evento click:

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

Se ve bien, gracias por la entrada! – Dr1Ku

+0

Pensé que esta solución temporal es mejor que nada. –

1

dependiendo de lo que está haciendo otra posibilidad podría ser la de tener múltiples Bools se establece en true cuando cada proceso se realiza .

Por ejemplo:

si tiene un rodaje servicio de geocodificación que quiere esperar, usted podría tener una var llamada GeoState

y en la parte resultado de la GeoState conjunto geocodificador en true, luego haga una comprobación de función cronometrada si todos los servicios se han devuelto verdaderos, cuando lo hayan hecho, haga que el mapa sea visible.

4

Esto funciona para mí. Estoy usando la biblioteca JQuery.

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

Hola Gabriel. Gracias por esta solución increíblemente simple y efectiva. ¡Funciona de maravilla! – Enes

+0

Tenga en cuenta que esto probablemente volverá a cargar el mapa cada vez, y con la API v3 de mapas hay un límite diario de cuántas veces puede cargar el elemento del mapa. – Simon

5

O simplemente podría ocultarlo como con css visablility o css opacity.

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

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

opacidad: 0 hizo el truco, yo estaba tratando de mostrar: ninguno, y no tuve buenos resultados –

2

Esto funcionará

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