我正在尝试使用V3为Google地图添加标记.我把我的地方变成了一个json对象(地方):
var num_places = places.length;
for(var i = 0; i < num_places; i++)
{
place_lat_lng = new google.maps.LatLng(places[i].lat, places[i].lng);
var infowindow = new google.maps.InfoWindow({
content: '<h2>' + places[i].name + '</h2><p>' + places[i].body + '</p>'
});
var marker = new google.maps.Marker({
position: place_lat_lng,
map: mymap,
title: places[i].name,
zIndex: i
});
google.maps.event.addListener(marker, 'click', function() {
infowindow.open(mymap, marker);
});
}
代码插入标记,但当我点击其中任何一个时,infoWindow显示(并将地图移动)始终显示在列表中的最后一个标记处.
我尝试使用数组来为infoWindow:
var infoWindow = new Array();
for(var i = 0; i < num_places; i++)
{
[...]
var infowindow[i] = new google.maps.InfoWindow({
content: '<h2>' + places[i].name + '</h2><p>' + places[i].body + '</p>'
});
[...]
google.maps.event.addListener(marker, 'click', function() {
infowindow[i].open(mymap, marker);
});
}
但是没有改变.
我错在哪里?
最佳答案 在JavaScript中,只有函数创建一个新的范围/闭包.因此,您只有一个infowindow变量,它被捕获到内部函数中,但最终将指向最后一个窗口.使用自调用函数来设置一个新的closuse:
for (var i = 0; ...) {
(function() {
var infowindow = ...;
})();
}
请注意,仍然不会单独捕获i的值.目前您似乎不需要它,但如果您这样做,请将其传递给函数以在函数内创建它的本地版本:
(function(i) { // this is the new local i with the value passed in from the outside
// ...accessible here
})(i); // this is the outer i