La API de Google Maps arroja "Error de referencia no detectado: Google no está definido" solo cuando se usa AJAX

85

Tengo una página que usa la API de Google Maps para mostrar un mapa. Cuando cargo la página directamente, aparece el mapa. Sin embargo, cuando intento cargar la página usando AJAX, aparece el error:

Uncaught ReferenceError: google is not defined

¿Por qué es esto?

Esta es la página con el mapa:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false"></script>
<script>
var directionsDisplay;
var directionsService = new google.maps.DirectionsService();
var map;
function initialize() {
  directionsDisplay = new google.maps.DirectionsRenderer();
  var chicago = new google.maps.LatLng(41.850033, -87.6500523);
  var mapOptions = { zoom:7, mapTypeId: google.maps.MapTypeId.ROADMAP, center: chicago }
  map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
  directionsDisplay.setMap(map);
}
$(document).ready(function(e) { initialize() });
</script>
<div id="map_canvas" style="height: 354px; width:713px;"></div>

Y esta la página con la llamada AJAX:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
</head>
<body>
<script>
$(document).ready(function(e) {
    $('button').click(function(){
        $.ajax({
            type: 'GET', url: 'map-display',
            success: function(d) { $('#a').html(d); }
        })
    });
});
</script>
<button>Call</button>
<div id="a"></div>
</body>
</html>

Gracias por tu ayuda.

verder
fuente

Respuestas:

87

La API no se puede cargar después de que el documento haya terminado de cargarse de forma predeterminada, deberá cargarlo de forma asincrónica.

modificar la página con el mapa:

<div id="map_canvas" style="height: 354px; width:713px;"></div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&callback=initialize"></script>
<script>
var directionsDisplay,
    directionsService,
    map;

function initialize() {
  var directionsService = new google.maps.DirectionsService();
  directionsDisplay = new google.maps.DirectionsRenderer();
  var chicago = new google.maps.LatLng(41.850033, -87.6500523);
  var mapOptions = { zoom:7, mapTypeId: google.maps.MapTypeId.ROADMAP, center: chicago }
  map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);
  directionsDisplay.setMap(map);
}

</script>

Para obtener más detalles, consulte: /programming/14184956/async-google-maps-api-v3-undefined-is-not-a-function/14185834#14185834

Ejemplo: http://jsfiddle.net/doktormolle/zJ5em/

Dr. Molle
fuente
¡Gracias! Tiene perfecto sentido ahora. Acabo de hacer un seguimiento: mi mapa aparece en gris (aunque con el logotipo de Google, el enlace y los términos de uso). Puedo ver en Firebug que los mosaicos se están cargando. ¿Sabes cuál podría ser la razón?
más verde
Por lo general, esto es el resultado de una opción de mapa faltante / no válida como zoom, mapTypeId o center (todos son obligatorios, cuando faltan o se ha asignado un valor no válido, no hay un valor predeterminado para una reserva, el mapa no se pudo procesar)
Dr. Molle
1
El problema tiene que ver con el hecho de que estoy ocultando el div en el que aparece el mapa. Tengo una pregunta separada para eso aquí: stackoverflow.com/questions/14263472/…
más ecológico
38

Sé que esta respuesta no está directamente relacionada con el problema de esta pregunta, pero en algunos casos se producirá el problema "Error de referencia no detectado: Google no está definido" si se llama a su archivo js antes de la API de mapas de Google que está utilizando ... así que NO HAGAS esto:

<script type ="text/javascript" src ="SomeJScriptfile.js"></script>
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?v=3.exp"></script>
Rex CoolCode Charles
fuente
la inclusión de mi api de google maps está por encima de mis js autodefinidos, aunque todavía aparece este error, pero no todo el tiempo. A veces, se carga bien. Necesito atrapar este error pero no tengo idea de cuál es la causa.
JkAlombro
@JkAlombro hace referencia a la respuesta aceptada en el siguiente enlace. Creo que cubre la mayoría de los casos en los que debería estar particularmente preocupado por el orden de los archivos de la biblioteca JScript. Es posible que también desee considerar el uso de una conexión asincrónica para administrar mejor esto, como se sugiere en la respuesta original para este hilo. stackoverflow.com/questions/4987977/…
Rex CoolCode Charles
8

Supongo que está inicializando algo antes de su función de inicialización: var directionsService = new google.maps.DirectionsService();

Mueva eso a la función, para que no intente ejecutarlo antes de que se cargue la página.

var directionsDisplay, directionsService;
var map;
function initialize() {
  directionsService = new google.maps.DirectionsService();
  directionsDisplay = new google.maps.DirectionsRenderer();
Duncan
fuente
5

Error de referencia no detectado: el error de Google no está definido desaparecerá cuando se elimine el aplazamiento asíncrono de la etiqueta de secuencia de comandos de la API del mapa.

Sohan Jangid
fuente
3

Lo que funcionó para mí después de seguir todas sus soluciones fue llamar a la API:

 <script async defer src="https://maps.googleapis.com/maps/api/js?key=you_API_KEY&callback=initMap&libraries=places"
            type="text/javascript"></script>

antes de mi: <div id="map"></div>

Estoy usando .ASP NET (MVC)

Fotini Pipi
fuente
0

Para mi

Añadiendo esta línea

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>

Antes de esta línea.

<script id="microloader" type="text/javascript" src=".sencha/app/microloader/development.js"></script>

trabajó

Rupesh
fuente
0

Puede que no sea relevante para todos, pero este pequeño detalle estaba causando que el mío no funcionara:

Cambiar div de esto:

<div class="map">

A esto:

<div id="map">
Jack Riminton
fuente
-2

Tal vez usando

<body onload="initialize();">

en vez de

$(function(){ 
     initialize();
});

puedo ayudarte.

rotring05
fuente