仅当使用AJAX时,Google Maps API才会引发“ Uncaught ReferenceError:未定义google”


85

我有一个使用Google Maps API来显示地图的页面。当我直接加载页面时,将显示地图。但是,当我尝试使用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>

谢谢你的帮助。

Answers:


87

默认情况下,文档完成加载后无法加载该API,您需要异步加载该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>

有关更多详细信息,请参见:https : //stackoverflow.com/questions/14184956/async-google-maps-api-v3-undefined-is-not-a-function/14185834#14185834

示例:http//jsfiddle.net/doktormolle/zJ5em/


谢谢!现在变得非常合理。刚刚进行了跟进:我的地图全部变灰(不过带有Google徽标,链接和使用条款)。我在Firebug中看到瓦片正在加载。您知道原因可能是什么吗?
2013年

通常,这是由于缺少/无效的地图选项(例如zoom,mapTypeId或center)导致的(所有这些都是必需的,当它们丢失或分配了无效值时,没有后备默认值,该地图无法呈现)
Dr.Molle

1
问题与以下事实有关:我隐藏了显示地图的div。我有一个单独的问题在这里:stackoverflow.com/questions/14263472/...
绿色的

38

我知道这个答案与这个问题的问题没有直接关系,但是在某些情况下,如果在您使用的google maps api之前调用js文件,则会出现“ Uncaught ReferenceError:google not defined”问题。所以不要这样做:

<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/…–
雷克斯·库尔德

8

大概是在初始化函数之前要初始化一些东西: var directionsService = new google.maps.DirectionsService();

将其移到函数中,这样它就不会在页面加载之前尝试执行它。

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


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();
});

能帮你。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.