我正在尝试设置一个Google地图实例,其中一些内容是为一组点动态生成的。
现在,我正在使用for循环遍历任意数量的纬度和经度值,并创建地图上的这些点的标记。
我正在尝试添加与每个标记相对应的信息窗口,并在单击这些标记时弹出它们。
然而,我遇到了一点小麻烦。看起来我的for循环创建了基本上所有的东西都可以正常工作,除了eventListener部分:
function drawMap(points) {
popUps = new Array();
infoWindows = new Array();
positions = new Array();
contents = '<div id = "content">' +
'<div id="siteNotice">' +
'</div>' +
'<p id="firstHeading" class="firstHeading">Position</h1>' +
'</div>';
infowindow = new google.maps.InfoWindow({
content: contents
});
for( i = 0; i < points.length; i++ ){
positions[i] = new google.maps.Marker({ position:
latlng[i],
map:map,
title:"Position"});
popUps[i] = '<div id = "content">' +
'<div id="siteNotice">' +
'</div>' +
'<p id="firstHeading" class="firstHeading">Position</h1>' +
'</div>';
infoWindows[i] = new google.maps.InfoWindow({
content: popUps[i]
});
// everything up to this point works fine, I can reference it all manually
// and get back the expected value.
google.maps.event.addListener(positions[i], 'click', function(){
infoWindows[i].open(map, positions[i]);
});
// if I change each instance of "i" to "0" here, I'll get a popup on the
// expected marker containing content that I defined in this for loop. Same for
// "1" and "2." But "i" doesn't work.
}
}
其中"map“是google.maps.Map的一个实例,每个popUps实例在最终产品中都会有所不同。
当页面加载时,我调用此函数,它将位置和标记添加到我的地图中:
drawMap([[13.283 , 162.232], [18.232 , 112.223], [17.233, 80.293]]);
有人知道为什么我不能动态创建eventListeners吗?任何帮助都将不胜感激!
提前谢谢。:)
编辑:
原来,这里的要求只是在页面加载时弹出div。我甚至不需要事件监听器...
然而,这两个答案都很好,并帮助我弄清楚了如何使原始代码工作,所以谢谢。:D
发布于 2011-10-18 15:34:28
在infowindow
声明之后创建一个函数来添加映射侦听器。该函数将创建一个闭包,并冻结传递给它的i
值。
...
infowindow = new google.maps.InfoWindow({
content: contents
});
var addListener = function (i) {
google.maps.event.addListener(positions[i], 'click', function(){
infoWindows[i].open(map, positions[i]);
});
...
}
然后在你的for
循环中调用它:
addListener(i);
发布于 2011-10-18 14:45:58
内部函数关闭变量i
。在for循环的末尾,所有的i
都将是points.length。这是一个非常常见的Javascript陷阱:
https://stackoverflow.com/questions/7809009
复制相似问题