API của Google Maps chỉ thông báo “Uncaught ReferenceError: google is notined” khi sử dụng AJAX


85

Tôi có một trang sử dụng API Google Maps để hiển thị bản đồ. Khi tôi tải trang trực tiếp, bản đồ sẽ xuất hiện. Tuy nhiên, khi tôi cố gắng tải trang bằng AJAX, tôi gặp lỗi:

Uncaught ReferenceError: google is not defined

Tại sao thế này?

Đây là trang có bản đồ:

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

Và đây là trang có lệnh gọi 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>

Cảm ơn bạn đã giúp đỡ.

Câu trả lời:


87

Không thể tải API sau khi tải xong tài liệu theo mặc định, bạn sẽ cần tải nó không đồng bộ.

sửa đổi trang với bản đồ:

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

Để biết thêm chi tiết, hãy xem tại: /programming/14184956/async-google-maps-api-v3-undefined-is-not-a- Chức năng/14185834#14185834

Ví dụ: http://jsfiddle.net/doktormolle/zJ5em/


Cảm ơn! Bây giờ có ý nghĩa hoàn hảo. Chỉ có một thông tin tiếp theo: bản đồ của tôi sắp chuyển sang màu xám (mặc dù có logo, liên kết và điều khoản sử dụng của Google). Tôi có thể thấy trong Firebug rằng các ô đang tải. Bạn có biết lý do có thể là gì không?
xanh hơn

Thông thường, đây là kết quả của một tùy chọn bản đồ bị thiếu / không hợp lệ như thu phóng, mapTypeId hoặc center (tất cả chúng đều là bắt buộc, khi chúng bị thiếu hoặc một giá trị không hợp lệ đã được chỉ định, không có giá trị mặc định cho dự phòng, bản đồ không thể được kết xuất)
Dr.Molle

1
Vấn đề liên quan đến thực tế là tôi đang ẩn div trong đó bản đồ xuất hiện. Tôi có một câu hỏi riêng cho điều đó ở đây: stackoverflow.com/questions/14263472/…
xanh hơn

38

Tôi biết câu trả lời này không liên quan trực tiếp đến vấn đề của câu hỏi này nhưng trong một số trường hợp, vấn đề "Uncaught ReferenceError: google is notined" sẽ xảy ra nếu tệp js của bạn được gọi trước api google maps mà bạn đang sử dụng ... vì vậy ĐỪNG LÀM điều này:

<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 google maps của tôi bao gồm ở trên js tự định nghĩa của tôi, mặc dù vẫn gặp lỗi này nhưng không phải lúc nào. Đôi khi, nó tải tốt. Tôi cần phải mắc lỗi này nhưng tôi không biết nguyên nhân là gì.
JkAlombro

@JkAlombro tham khảo câu trả lời được chấp nhận trong liên kết bên dưới. Tôi nghĩ rằng nó bao gồm phần lớn các trường hợp mà bạn nên đặc biệt quan tâm đến thứ tự của các tệp thư viện JScript của mình. Bạn cũng có thể muốn xem xét sử dụng kết nối không đồng bộ để quản lý điều này tốt hơn như được đề xuất trong câu trả lời ban đầu cho chủ đề này. stackoverflow.com/questions/4987977/…
Rex CoolCode Charles

8

Theo dự đoán, bạn đang khởi tạo một cái gì đó trước khi hàm khởi tạo: var directionsService = new google.maps.DirectionsService();

Di chuyển nó vào hàm, vì vậy nó sẽ không thử và thực thi nó trước khi trang được tải.

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

5

Uncaught ReferenceError: lỗi không xác định được google sẽ biến mất khi loại bỏ trì hoãn không đồng bộ khỏi thẻ tập lệnh API bản đồ.


3

Điều hiệu quả với tôi sau khi làm theo tất cả các cách giải quyết của bạn là gọi API:

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

trước khi của tôi : <div id="map"></div>

Tôi đang sử dụng .ASP NET (MVC)


0

Cho tôi

Thêm dòng này

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

Trước dòng này.

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

đã làm việc


0

Có thể không phù hợp với tất cả mọi người nhưng chi tiết nhỏ này đã khiến tôi không hoạt động:

Thay đổi div từ cái này:

<div class="map">

Về điều này:

<div id="map">

-2

Có thể sử dụng

<body onload="initialize();">

thay vì

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

có thể giúp bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.