我正在尝试设置一个Google地图实例,其中为一组点动态生成一些内容。
现在,我正在使用for循环遍历任意数量的纬度和经度值,并在地图上创建标记。
我正在尝试添加与这些标记相对应的信息窗口,并在单击标记时弹出它们。
但是,我遇到了一些麻烦。除了eventListener部分之外,它看起来像我的for循环基本上创建了一切正常工作:
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
答案 0 :(得分:6)
在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);
答案 1 :(得分:1)
内部函数正在关闭变量 i
。在for循环结束时,所有i
s都将是points.length。这是一个非常常见的Javascript问题: