谷歌地图异步添加标记
Google Maps Asynchronously Add Markers
我正在玩谷歌地图API,想加载一张地图,然后使用边界访问外部API,以获取地图中多个城市的当前天气状况。我遇到的问题是,如果我有async: false
,它可以正常工作,但一旦我设置了async: true
,标记就不再加载。这就是我所拥有的,我觉得这是一件非常简单的事情。
function initialize()
{
var mapProp = {
center: new google.maps.LatLng(41.8369,-95.6847),
zoom:4,
disableDefaultUI:true,
mapTypeId: google.maps.MapTypeId.SATELLITE
};
map = new google.maps.Map(document.getElementById("googleMap"),mapProp);
google.maps.event.addListener(map, 'bounds_changed', function() {
calcBounds();
});
function calcBounds() {
var bounds = map.getBounds();
var ne = bounds.getNorthEast();
var sw = bounds.getSouthWest();
for (var lat = ne.lat(); lat > sw.lat(); lat = lat - 5) {
for (var long = ne.lng(); long > sw.lng(); long = long - 5) {
$.ajax({
async: false,
url: 'http://api.openweathermap.org/data/2.5/weather?lat=' + lat + '&lon=' + long + '&APPID=' + apikey,
dataType: "json",
success: function(data) {
var marker = new google.maps.Marker({
map: map,
position: new google.maps.LatLng(lat, long),
});//End Marker
},//End Success
error: function() {
alert("ERROR");
}
});//End AJAX
}//End Long for
}//End lat For
}//End function
对于学习Javascript的人来说,您遇到的问题很常见。发生的事情是,每次你经过循环的一次迭代,lat&long被更改。这就成了一个问题,因为您的ajax函数正在引用这个变量!因此,在实践中,这意味着所有的web请求都将针对相同的lat和long,因为循环可能在第一个ajax请求发送之前就已经完成了。。。执行其中一个循环大约需要5毫秒,发送和接收ajax请求大约需要50-100毫秒。将其设置为async:false有效(但它会冻结浏览器!),因为它会等到发送并返回请求后再更改lat
和long
变量的值。因此,很明显,您希望ajax请求记住您希望它查找的值,而不是现在的内存值。解决方案是将要使用的变量放在闭包中,这样它们就可以保留在ajax函数的本地,并且在循环的下一次迭代中不会发生更改。
下面是一个工作示例。和一个jsfiddle:http://jsfiddle.net/47b3mjn3/2/
function initialize() {
var mapProp = {
center: new google.maps.LatLng(41.8369, -95.6847),
zoom: 4,
disableDefaultUI: true,
mapTypeId: google.maps.MapTypeId.SATELLITE
};
map = new google.maps.Map(document.getElementById("googleMap"), mapProp);
google.maps.event.addListener(map, 'bounds_changed', function () {
calcBounds();
});
function calcBounds() {
var bounds = map.getBounds();
var ne = bounds.getNorthEast();
var sw = bounds.getSouthWest();
for (var lat = ne.lat(); lat > sw.lat(); lat = lat - 5) {
for (var long = ne.lng(); long > sw.lng(); long = long - 5) {
addMarker(lat, long);
} //End Long for
} //End lat For
} //End function
}
function addMarker(lat, long) {
_lat = lat;
_long = long;
$.ajax({
url: 'http://api.openweathermap.org/data/2.5/weather?lat=' + _lat + '&lon=' + _long + '&APPID=' + apiKey,
dataType: "json",
success: function (data) {
new google.maps.Marker({
map: map,
position: new google.maps.LatLng(_lat, _long),
}); //End Marker
}, //End Success
error: function () {
alert("ERROR");
}
}); //End AJAX
}
initialize();
相关文章:
- 使用Google Maps API向标记添加多个字符
- 正在尝试将标题标记添加到mailto链接,正文中包含URL
- 如何将元标记添加到最顶部的iFrame
- 将标记添加到您的 href
- 为什么要将此p标记添加为新行
- 如何使用 Ext.js 向内存中的标记添加属性
- Javascript 向我的锚标记添加一个变量
- 谷歌地图api:如何将我自己的标记添加到地图
- 如何将“跨源”标记添加到动态加载的脚本中
- 谷歌地图:将带有信息框的多个标记添加到自定义地图
- 如何将waze事件标记添加到带有流量的google地图javascript API生成的地图
- HTML::向输入标记添加链接
- 将标记添加到现有的谷歌地图(不刷新谷歌地图)
- 使用Javascript为select标记添加非标准属性
- 如何将标记添加到Mapbox图层控件
- 如何在确认框中点击“是”后将元标记添加到文档中
- 使用Knockout.js的数组方法将地图标记添加到Google地图
- 如何等到 DOM 加载后再将脚本标记添加到
- 向加载的KML中的标记添加单击事件
- 检测在将标记添加到页面后是否加载了 javascript 文件