Google Maps API v3 – getBounds未定义

我从v2切换到v3谷歌地图API,并得到gMap.getBounds()函数的问题。

初始化后,我需要获取地图的边界。

这是我的JavaScript代码:

 var gMap; $(document).ready( function() { var latlng = new google.maps.LatLng(55.755327, 37.622166); var myOptions = { zoom: 12, center: latlng, mapTypeId: google.maps.MapTypeId.ROADMAP }; gMap = new google.maps.Map(document.getElementById("GoogleMapControl"), myOptions); alert(gMap.getBounds()); } ); 

所以现在它提醒我gMap.getBounds()是未定义的。

我试图在click事件中获取getBounds值,它对我来说工作正常,但是在load map事件中我得不到相同的结果。

在Google Maps API v2中加载文档时,getBounds也能正常工作,但在V3中失败。

你能帮我解决这个问题吗?

在v3 API的早期, getBounds()方法要求地图图块完成加载,以便返回正确的结果。 不过现在看起来你可以监听在tilesloaded事件之前被激发的tilesloaded事件:

 <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> <title>Google Maps v3 - getBounds is undefined</title> <script src="http://maps.google.com/maps/api/js?sensor=false" type="text/javascript"></script> </head> <body> <div id="map" style="width: 500px; height: 350px;"></div> <script type="text/javascript"> var map = new google.maps.Map(document.getElementById("map"), { zoom: 12, center: new google.maps.LatLng(55.755327, 37.622166), mapTypeId: google.maps.MapTypeId.ROADMAP }); google.maps.event.addListener(map, 'bounds_changed', function() { alert(map.getBounds()); }); </script> </body> </html> 

它应该工作,至less根据getBounds()的文档。 然而:

 var gMap; $(document).ready(function() { var latlng = new google.maps.LatLng(55.755327, 37.622166); var myOptions = { zoom: 12, center: latlng, mapTypeId: google.maps.MapTypeId.ROADMAP }; gMap = new google.maps.Map(document.getElementById("GoogleMapControl"), myOptions); google.maps.event.addListenerOnce(gMap, 'idle', function(){ alert(this.getBounds()); }); }); 

看到它在这里工作。

我在说萨尔曼的解决scheme比较好,因为idle事件比瓷砖加载要早,因为它等待所有瓷砖加载。 但仔细一看,似乎bounds_changed甚至更早被调用,而且更有意义,因为您正在寻找边界,对吗? 🙂

所以我的解决scheme是:

 google.maps.event.addListenerOnce(gMap, 'bounds_changed', function(){ alert(this.getBounds()); }); 

在这里的其他评论,build议使用“空闲”的“bounds_changed”事件,我同意。 当然在IE8下至less在我的开发机器上“bounds_changed”之前触发“空闲”,让我在getBounds上引用null。

但是,当您拖动地图时,“bounds_changed”事件将会持续触发。 因此,如果你想使用这个事件来开始加载标记,这将是沉重的你的networking服务器。

我对这个问题的多浏览器解决scheme:

 google.maps.event.addListenerOnce(gmap, "bounds_changed", function(){ loadMyMarkers(); google.maps.event.addListener(gmap, "idle", loadMyMarkers); }); 

那么,我不知道如果我太晚了,但这是我的解决scheme使用gmaps.js插件:

 map = new GMaps({...}); // bounds loaded? if not try again after 0.5 sec var check_bounds = function(){ var ok = true; if (map.getBounds() === undefined) ok = false; if (! ok) setTimeout(check_bounds, 500); else { //ok to query bounds here var bounds = map.getBounds(); } } //call it check_bounds();