Google Maps API видає “Uncaught ReferenceError: google не визначено” лише під час використання 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>

Спасибі за вашу допомогу.

Відповіді:


87

Після завантаження документа за замовчуванням 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 або центр (усі вони обов’язкові, коли вони відсутні або призначено недійсне значення, для резервного запасного значення немає значення за замовчуванням неможливо надати)
Dr.Molle

1
Проблема пов’язана з тим, що я приховую div, в якому відображається карта. У мене є окреме запитання щодо цього тут: stackoverflow.com/questions/14263472/…
більш екологічний

38

Я знаю, що ця відповідь не пов’язана безпосередньо з проблемою цього запитання, але в деяких випадках виникає проблема "Uncaught ReferenceError: google не визначений", якщо ваш файл js викликається до API Google Maps, який ви використовуєте ... тому НЕ РОБІТЬ цього:

<script type ="text/javascript" src ="SomeJScriptfile.js"></script>
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?v=3.exp"></script>

мій API API Google Maps знаходиться вище мого самовизначеного 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 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();
});

може вам допомогти.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.