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>

мои 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">

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.