2010-02-24 33 views
3

我想爲每個生成的標記添加一個Listener事件,這樣當您單擊標記時,您將被重定向到permalink url。使用下面的代碼永久鏈接值是相同的每個標記(它得到的最後一個值)。我已閱讀關閉問題,這似乎是我所擁有的。雖然我沒有看到我看過的例子。Listener和Google Maps標記的關閉問題

有人可以看看我的代碼,並指出我在正確的方向嗎?任何幫助是極大的讚賞!

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

這是一關於閉包涉及循環,可能的欺騙最常見和重複的問題:http://stackoverflow.com/questions/1734749 http://stackoverflow.com/questions/643542 http://stackoverflow.com/questions/1582634 http:// stackoverflow.com/questions/1331769 http://stackoverflow.c om/questions/1552941 http://stackoverflow.com/questions/933343 http://stackoverflow.com/questions/1579978 http://stackoverflow.com/questions/1413916 http://stackoverflow.com/questions/2314175 – CMS 2010-02-24 20:33:11

+0

對不起,要求另一個關閉問題,但我看了一堆早期的答案,只是不能得到它的工作。儘管感謝鏈接! – 2010-02-25 08:36:32

回答

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

通過使一個新的詞彙範圍,並在每個迭代的「永久」值的副本,你的處理程序應該工作更好。

+0

爲什麼我努力想出一個如此簡單的解決方案?我嫉妒 – Bob 2010-02-24 20:37:31

+0

謝謝Pointy,我一直試圖讓這個工作幾個小時。你的代碼工作,你是我的英雄! – 2010-02-25 08:29:39

2

的JavaScript只有函數範圍,所以當你宣佈VAR在中間的for循環你實際上只是宣佈他們,一旦整個功能。你應該做的第一件事是把所有的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循環循環時都會創建一個新值。

編輯:所以是的,波蒂打我實際解決你的問題。但是,你有,至少,這個問題

+0

感謝鮑勃幫助我,你真棒:) – 2010-02-25 08:30:17

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