我有一个json对象infoCentros
,用于构建地图,如下所示:
for ( var i = 0; i < infoCentros.length; i++ ) {
var centro = infoCentros[i];
var lat = centro.cordenadas.lat;
var lon = centro.cordenadas.long;
if (lat && lon) {
c++;
latlon = new google.maps.LatLng(lat, lon);
var moptions = {
position: latlon,
map: $project.gmap
}
moptions.icon = theme_uri + '/images/marker.png';
var marker = new google.maps.Marker(moptions);
$project.mapMarkers.push(marker);
google.maps.event.addListener(marker, 'click', function() {
$project.mapInfoWindow.setContent(
'<div class="sescam-info-window">' +
'<h3>' + centro.nombre + '</h3>' +
'<p>' + centro.lugar + '</h3>' +
'<p>Coordinador</p>' +
'<p>' + centro.coordinador.nombre + '</p>' +
'<p>' + centro.coordinador.email + '</p>' +
'<p>Responsable</p>' +
'<p>' + centro.responsable.nombre + '</p>' +
'<p>' + centro.responsable.email + '</p>'
+ '</div>'
);
$project.mapInfoWindow.open($project.gmap, marker);
});
$project.mapBounds.extend(latlon);
}
}
它似乎工作正常,但如果我有5个标记,我点击哪一个并不重要,infowindow总是对应最后一个项目(位置和内容),
知道我错过了什么吗?我认为将marker
传递给addListener就可以了。
答案 0 :(得分:1)
问题在于google.maps.event.addListener的第三个参数。该匿名函数包含来自父作用域的变量,当使用标记单击进行评估时,该变量将始终采用指定的最后一个值。寻找关闭更多细节。但是,您可以使用&#34; bind&#34;来获得所需的行为。 javascript函数原型的功能如下:
//inside for loop
google.maps.event.addListener(marker, 'click', handleMarkerClick.bind(undefined, marker, i));
//other codes if any...
定义handleClick
function handleMarkerClick(marker, index) {
if (typeof infowindow === 'undefined') {
infowindow = new google.maps.InfoWindow({});
}
var data = infoCentros[index]//helpful data
//create content with dynamic data
infowindow.setContent("dynamic content");
infowindow.open(marker.getMap(), marker);//modify as per your requirement
}
答案 1 :(得分:-1)
Duncan是对的,他的意思是你必须在你的for循环之外附加监听器。它不是谷歌地图特有的,它是javascript的工作原理。尝试搜索“javascript闭包换循环”或访问此链接 - Closures in Javascript以获得简单说明。