Google Maps API выдает ошибку «Uncaught ReferenceError: google is not defined» только при использовании AJAX.

85

У меня есть страница, которая использует API Карт Google для отображения карты. Когда я загружаю страницу напрямую, появляется карта. Однако когда я пытаюсь загрузить страницу с помощью AJAX, я получаю сообщение об ошибке:

Uncaught ReferenceError: google is not defined

Почему это?

Это страница с картой:

<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>

А это страница с вызовом 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>

Спасибо за вашу помощь.

зеленее
источник

Ответы:

88

По умолчанию API не может быть загружен после завершения загрузки документа, вам необходимо загрузить его асинхронно.

изменить страницу с картой:

<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>

Для получения более подробной информации посмотрите: /programming/14184956/async-google-maps-api-v3-undefined-is-not-a-function/14185834#14185834

Пример: http://jsfiddle.net/doktormolle/zJ5em/

Доктор Молле
источник
Благодаря! Теперь это имеет смысл. Только что получил продолжение: моя карта становится серой (хотя с логотипом Google, ссылкой и условиями использования). Я вижу в Firebug, что плитки загружаются. Вы знаете, в чем может быть причина?
зеленее
Обычно это является результатом отсутствия / недопустимой опции карты, такой как масштабирование, mapTypeId или center (все они необходимы, если они отсутствуют или было присвоено недопустимое значение, нет значения по умолчанию для резервной копии, карта не может быть воспроизведен)
Доктор Молле
1
Проблема связана с тем, что я скрываю div, в котором отображается карта. У меня есть отдельный вопрос по этому поводу: stackoverflow.com/questions/14263472/…
зеленее
39

Я знаю, что этот ответ не имеет прямого отношения к проблеме, связанной с этим вопросом, но в некоторых случаях возникает проблема «Uncaught ReferenceError: google is not defined», если ваш файл js вызывается до api карт Google, которые вы используете ... так что НЕ ДЕЛАЙТЕ этого:

<script type ="text/javascript" src ="SomeJScriptfile.js"></script>
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?v=3.exp"></script>
Рекс CoolCode Чарльз
источник
мои google maps api include выше моих самоопределенных js, но все еще получаю эту ошибку, но не все время. Иногда загружается просто отлично. Мне нужно отловить эту ошибку, но я понятия не имею, в чем ее причина.
JkAlombro
Ссылка @JkAlombro приняла ответ по ссылке ниже. Я думаю, он охватывает большинство случаев, когда вам следует особенно беспокоиться о порядке файлов библиотеки JScript. Вы также можете рассмотреть возможность использования асинхронного соединения, чтобы лучше управлять этим, как было предложено в исходном ответе для этого потока. stackoverflow.com/questions/4987977/…
Rex CoolCode Чарльз
8

Предположительно, вы что-то инициализируете перед своей функцией инициализации: var directionsService = new google.maps.DirectionsService();

Переместите это в функцию, чтобы она не пыталась выполнить ее до загрузки страницы.

var directionsDisplay, directionsService;
var map;
function initialize() {
  directionsService = new google.maps.DirectionsService();
  directionsDisplay = new google.maps.DirectionsRenderer();
Дункан
источник
5

Uncaught ReferenceError: ошибка Google не определена исчезнет при удалении асинхронной задержки из тега скрипта API карты.

Сохан Джангид
источник
3

Что сработало для меня после того, как вы выполнили все ваши обходные пути, так это вызов API:

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

перед моим: <div id="map"></div>

Я использую .ASP NET (MVC)

Фотини Пипи
источник
0

Для меня

Добавление этой строки

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

Перед этой строкой.

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

работал

Рупеш
источник
0

Может быть, не для всех, но эта маленькая деталь заставляла мою не работать:

Измените div с этого:

<div class="map">

К этому:

<div id="map">
Джек Риминтон
источник
-2

Может быть, используя

<body onload="initialize();">

вместо

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

могу помочь тебе.

Башар Сёкер
источник