0

我正在使用Google地圖的API。我有一系列標記和一系列信息窗口,我試圖在單擊標記時顯示各自的信息窗口。我無法理解應該如何添加我的事件偵聽器,以便它尊重JavaScript閉包。我應該如何重構我的addEventListener?

(錯誤)代碼,所有這些都包含在一個initialize()在頁面加載時被調用:

var markers = [] 
var infoWindows = [] 

[define all markers and info windows here, long so cut] 

for (var i = 0; i < markers.length; i++) 
{ 
    google.maps.event.addListener(markers[i], 'click', function() { 
     infoWindows[i].open(mymap, markers[i]); 
    }); 
} 

我確信,我所有的對象都正確來這裏之前初始化。

我對我的問題的理解是,當點擊事件發生時,infoWindows [i]不再可用。我能做些什麼,以便eventListener按我的想法工作,數組中第i個位置的infoWindow對應於第i個位置的標記?

謝謝。

+0

[Google Maps API多個標記與Infowindows]的可能重複(http://stackoverflow.com/questions/11106671/google-maps-api-multiple-markers-with-infowindows) – geocodezip 2013-03-20 20:04:53

回答

1

您是對的,infoWindows[i]已不可訪問,因爲i的值已更新。解決這個

的一種方式是使用.forEach

markers.forEach(function(value, i){ 
    google.maps.event.addListener(markers[i], 'click', function() { 
     infoWindows[i].open(mymap, markers[i]); 
    }); 
}) 

在這種情況下對每個事件偵聽器的變量i是在一個不同的功能。您當前的代碼每次都使用相同的i變量,每個事件偵聽器中的i變量都是相同的。在分配所有事件監聽器後,i保持其最終值,markers[i]引用列表中的最後一個標記。

檢查出this question的替代解決方案。

+0

謝謝,這似乎有完成了這個把戲。該鏈接對於進一步瞭解JavaScript關閉也非常有幫助。 – tropicalmug 2013-03-20 20:08:05