Listener和Google Maps标记的关闭问题

时间:2010-02-24 19:54:38

标签: javascript google-maps javascript-events listener

我想为每个生成的标记添加一个Listener事件,这样当您单击标记时,您将被重定向到永久链接URL。使用下面的代码,每个标记的永久链接值都是相同的(它是最后一个值)。我已经阅读过关闭问题,这似乎就是我所拥有的。我并没有真正得到我看过的例子。

有人可以看看我的代码并指出我正确的方向吗?非常感谢任何帮助!

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;});
            }

3 个答案:

答案 0 :(得分:11)

试试这个:

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);
}

通过在每次迭代中创建一个带有“永久链接”值副本的新词法范围,您的处理程序应该能够更好地工作。

答案 1 :(得分:2)

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;});
            }

您的点击功能将为每个标记事件使用永久链接的最终值,因为每次for循环循环时,永久链接都会被替换为新值。

编辑:所以是的,Pointy打败我实际解决你的问题。但至少你有一个问题的解释

答案 2 :(得分:1)

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

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

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);

    }); 

}

要查看工作示例,请参阅here