for (var i=0; i<layerCount; i++){
for (var j=0; j<layerData[i].data.length; j++){
var text = layerData[i].data[j].text;
var latlng = new google.maps.LatLng(layerData[i].data[j].lat, layerData[i].data[j].lng);
var marker = new google.maps.Marker({map: map, position: latlng});
var infowindow = new google.maps.InfoWindow({content: text});
google.maps.event.addListener(marker, 'click', function() {infowindow.open(map,marker);});
}
}
上述代码中的问题很可能出现在以google.maps.event.addListener
开头的行中。无论我点击哪个标记,我都会在layerdata[i].data[j]
的数据字段中打开最后一个项目的信息窗口。好像我通过引用调用而不是通过值调用,因此所有侦听器的infowindow
和marker
都是数组中的最后一项。
但我该如何解决这个问题?
非常感谢!答案 0 :(得分:3)
您必须创建closure:
for (var i=0; i<layerCount; i++){
for (var j=0; j<layerData[i].data.length; j++){
var text = layerData[i].data[j].text;
var latlng = new google.maps.LatLng(layerData[i].data[j].lat, layerData[i].data[j].lng);
var marker = new google.maps.Marker({map: map, position: latlng});
var infowindow = new google.maps.InfoWindow({content: text});
bindOpenWindow(infowindow, map, marker);
}
}
function bindOpenWindow(infowindow, map, marker)
{
google.maps.event.addListener(marker, 'click', function() {infowindow.open(map, marker);});
}
看看它是否有帮助;)
答案 1 :(得分:1)
JavaScript没有块范围的概念,只有函数和全局范围。您可以使用闭包来解决它:
for (var i = 0; i < layerCount; i++){
for (var j = 0; j < layerData[i].data.length; j++){
var text = layerData[i].data[j].text;
var latlng = new google.maps.LatLng(layerData[i].data[j].lat, layerData[i].data[j].lng);
var marker = new google.maps.Marker({map: map, position: latlng});
var infowindow = new google.maps.InfoWindow({content: text});
google.maps.event.addListener(marker, 'click', (function(infowindow, marker) {
return function() {infowindow.open(map, marker);};
})(infowindow, marker));
}
}