2012-02-10 13 views

Respuesta

97

if (google.maps) {...} le dará un error de referencia si google no está definido (es decir, si la API no se cargó).

En su lugar, use if (typeof google === 'object' && typeof google.maps === 'object') {...} para verificar si se cargó correctamente.

+0

Gracias, esto es lo que he estado buscando. – Nirmal

+4

Estoy en un entorno de espacio de nombres, por lo que simplemente hacer referencia a 'google' no funcionó, tuve que usar' window.google'. – Jon

+0

Creo que hay casos en los que se puede definir 'google.maps' antes de que la API de Maps haya terminado de cargarse completamente, lo que provoca que se rompa de forma incoherente. Si alguien más tiene el mismo problema, puede intentar mi respuesta a continuación, utilizando una devolución de llamada. –

4

Se podría considerar el uso de la Google Loader

google.load("maps", "3", {callback: myFn}); 

Se carga el archivo javascript designado, a continuación, ejecutar la devolución de llamada, especificado en el argumento optionalSettings.

+2

Gracias, pero esto no resuelve mi problema porque el script del cargador en sí tiene que cargarse desde Internet. Si la conexión falla, 'google.load' lanzará un error de referencia. Sin embargo, aprecia tu respuesta. – Nirmal

+0

La API de Google Maps no es parte de las API disponibles según esa página. – jkinz

+0

La respuesta data de febrero de 2012. La API del cargador podría haber cambiado desde entonces. –

0

Creo que se puede hacer esto con un if(google && google.maps){ … }, a menos que decir lo que está en this post, que es aproximadamente Maps API V2, pero alguien actualiza para v3 here.

+0

'if (google.maps) {...}' me lanzó un error cuando no se cargó la API. DaveS ha abordado el problema en su respuesta. ¡Gracias! – Nirmal

2

EDIT: Si no tiene miedo de ser "no explícito", puede utilizar following, de lo contrario, si no está seguro de si habrá una sola instancia de google variable, entonces use DaveS answer.

Comprobar si API de Google Maps v3 carga:

if(google && google.maps){ 
    console.log('Google maps loaded'); 
} 

en esta variable de condición google utilizará Javascript verdad lo que si va a ser la función u objeto o cadena a la que llegará a ser verdad y luego tratará de acceso maps interior de ese objeto.

Y inversa:

if(!google || !google.maps){ 
    console.log('Not loaded yet'); 
} 
+0

Esto no funcionó para mí, pero la respuesta de DaveS sí. – wloescher

13

en la carga asíncrona éste funciona para mí (Gracias a Daves):

function appendBootstrap() { 
    if (typeof google === 'object' && typeof google.maps === 'object') { 
     handleApiReady(); 
    } else { 
     var script = document.createElement("script"); 
     script.type = "text/javascript"; 
     script.src = "http://maps.google.com/maps/api/js?sensor=false&callback=handleApiReady"; 
     document.body.appendChild(script); 
    } 
} 

function handleApiReady() { 
    var myLatlng = new google.maps.LatLng(39.51728, 34.765211); 
    var myOptions = { 
     zoom: 6, 
     center: myLatlng, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    } 
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 
} 
1

Un simple if(google && google.maps) cheque no funcionó para mí; Todavía consigo un error al intentar acceder a la API:

TypeError: google.maps.LatLng is not a constructor

En mi caso esto es probablemente debido a mis controladores de eventos de ratón se dispare antes de la API de mapas tiene incluso la descarga final.En este caso, para comprobar de forma fiable si se cargan los mapas, se crea un "gmaps" alias y su inicialización El dom lista (usando jQuery):

var gmaps; 
$(function() { 
    gmaps = google.maps; 
}); 

entonces en mis controladores de eventos que simplemente puede utilizar:

if(gmaps) { 
    // do stuff with maps 
} 
1

tratar

(google && 'maps' in google)?true:false 

o

if(google && 'maps' in google){ 
    //true 
} 
else{ 
    //false 
} 

desde que tenía un problemacon la siguiente en el móvil:

if (typeof google === 'object' && typeof google.maps === 'object') {...} 
20

Ninguna de las respuestas actuales están trabajando con 100% de consistencia para mí (excluyendo cargador de Google, que no he T intentó). No creo que verificar la existencia de google.maps sea suficiente para asegurarnos de que la biblioteca haya terminado de cargarse. Aquí están las solicitudes de red que estoy viendo cuando se solicitan la API de Google Maps y la biblioteca Lugares opcional:

maps api network requests

Ese primer script define google.maps, pero el código que es probable que tenga (google.maps.Map, google.maps.places) ganó' Estar cerca hasta que se hayan cargado algunos de los otros scripts.

Es mucho más seguro definir una devolución de llamada al cargar la API de Maps. La respuesta de @ verti es casi correcta, pero aún depende de comprobar google.maps de manera insegura.

En su lugar, hacer esto:

HTML:

<!-- "async" and "defer" are optional, but help the page load faster. --> 
<script async defer 
    src="https://maps.googleapis.com/maps/api/js?key=API_KEY&callback=mapsCallback"> 
</script> 

JS:

var isMapsApiLoaded = false; 
window.mapsCallback = function() { 
    isMapsApiLoaded = true; 
    // initialize map, etc. 
}; 
+0

Simple y funciona. – Abram

+2

Esta es una respuesta mejor que la mía hoy en día, si no tiene que admitir versiones anteriores de IE (<9). – DaveS

0

Si está utilizando jQuery, tengo buenas noticias para ti:

if (typeof google === 'object' && typeof google.maps === 'object') { 
    gmapInit(); 
} else { 
    $.getScript('https://maps.googleapis.com/maps/api/js?key='+gApiKey+'&language=en', function(){ 
     gmapInit(); 
    }); 
} 

es similar a answer-17702802