Javascript 侦听器和谷歌地图标记的关闭问题

Javascript 侦听器和谷歌地图标记的关闭问题,javascript,google-maps,listener,dom-events,Javascript,Google Maps,Listener,Dom Events,我想为每个生成的标记添加一个侦听器事件,这样当您单击一个标记时,就会重定向到永久链接url。对于下面的代码,permalink值对于每个标记都是相同的(它是最后一个值)。我读过关于关闭问题的书,这似乎就是我所面临的问题。不过,我并没有真正得到我看过的例子 有人能看看我的代码,给我指出正确的方向吗?非常感谢您的帮助 downloadUrl("http://localhost/map/generatexml.php", function(data) { var xml = p

我想为每个生成的标记添加一个侦听器事件,这样当您单击一个标记时,就会重定向到永久链接url。对于下面的代码,permalink值对于每个标记都是相同的(它是最后一个值)。我读过关于关闭问题的书,这似乎就是我所面临的问题。不过,我并没有真正得到我看过的例子

有人能看看我的代码,给我指出正确的方向吗?非常感谢您的帮助

downloadUrl("http://localhost/map/generatexml.php", function(data) {
            var xml = parseXml(data);
            var markers = xml.documentElement.getElementsByTagName("marker");
            for (var i = 0; i < markers.length; i++) {
              var permalink = markers[i].getAttribute("permalink");
              var point = new google.maps.LatLng(
                  parseFloat(markers[i].getAttribute("lat")),
                  parseFloat(markers[i].getAttribute("lng")));
              var marker = new google.maps.Marker({map: map,position: point,icon: icon.icon,shadow: icon.shadow,title: name});
              google.maps.event.addListener(marker, 'click', function() {self.location.href = permalink;});
            }
下载URL(“http://localhost/map/generatexml.php,函数(数据){
var xml=parseXml(数据);
var markers=xml.documentElement.getElementsByTagName(“标记”);
对于(var i=0;i

JavaScript只有函数范围,所以当你在for循环中间声明var时,你实际上只为整个函数声明了一次。你首先要做的就是把所有的var声明都放在上面,让他们更了解发生了什么:

downloadUrl("http://localhost/map/generatexml.php", function(data) {
            var xml = parseXml(data);
            var markers = xml.documentElement.getElementsByTagName("marker");
            var i, permalink, point, marker;
            for (i = 0; i < markers.length; i++) {
              permalink = markers[i].getAttribute("permalink");
              point = new google.maps.LatLng(
                  parseFloat(markers[i].getAttribute("lat")),
                  parseFloat(markers[i].getAttribute("lng")));
              marker = new google.maps.Marker({map: map,position: point,icon: icon.icon,shadow: icon.shadow,title: name});
              google.maps.event.addListener(marker, 'click', function() {self.location.href = permalink;});
            }
下载URL(“http://localhost/map/generatexml.php,函数(数据){
var xml=parseXml(数据);
var markers=xml.documentElement.getElementsByTagName(“标记”);
变量i,永久性,点,标记;
对于(i=0;i
单击函数将为每个标记事件使用permalink的最终值,因为每次for循环时,permalink都会被一个新值替换

编辑:是的,我比你更想解决你的问题。但你至少有一个问题的解释,试试这个:

for (var i = 0; i < markers.length; ++i) {
  // ... like what you have already ...
  (function(permalink) {
    google.maps.event.addListener(marker, 'click', function() {self.location.href = permalink;});
  })(permalink);
}
for(变量i=0;i

通过在每次迭代时使用“permalink”值的副本创建一个新的词法作用域,您的处理程序应该工作得更好。

我们必须使用闭包来解决这个问题

使用下面的代码段将信息窗口添加到标记

function AddInfoWidnow(marker,message)
{
     var infowindow = new google.maps.InfoWindow({ content: message });

     google.maps.event.addListener(marker, 'click', function() {

     infowindow.open(marker.get('map'), marker);

    }); 

}

要查看工作示例,请参考

这是关于涉及循环的闭包、可能的重复问题之一:很抱歉又问了一个闭包问题,但我浏览了一大堆以前的答案,还是无法让它工作。不过感谢链接!我为什么要费劲地想出这个问题这么简单的解决方案?我嫉妒,谢谢你,我已经试了好几个小时了。你的代码运行正常,你是我的英雄!谢谢鲍勃帮我,你真棒:)