2009-05-06 83 views
5

我有一些谷歌地圖/ Javascript問題。我想我知道麻煩是什麼,但只是不知道它的方式。谷歌地圖麻煩:關閉和通過引用

我的問題的一個例子是here。無論您點擊什麼標記,第二個都會顯示出來。我顯然將錯誤的信息傳遞給我的事件偵聽器,但我似乎無法獲得正確的代碼。下面的代碼的減少部分:

首先,這裏是我的代碼的一部分:

if (GBrowserIsCompatible() && mapResults != null) { 
    // Read in the JSON 
    var mapDetailsArray = loadJSON(); 

    // Create a map 
    var map = new google.maps.Map2(document.getElementById(elementId)); 
    map.setCenter(new google.maps.LatLng(mapDetailsArray[0].getLatitude(), 
     mapDetailsArray[0].getLongitude()), 13); 
    map.addControl(new google.maps.SmallMapControl()); 

    // Add the points and center 
    var mgr = new google.maps.MarkerManager(map); 
    var bounds = new google.maps.LatLngBounds(); 
    for (var i = 0; i < mapDetailsArray.length; i++) { 
    var mapDetails = mapDetailsArray[i]; 

    var point = new google.maps.LatLng(mapDetails.getLatitude(), mapDetails 
     .getLongitude()); 
    bounds.extend(point); 

    // Create our marker 
    var marker = new google.maps.Marker(point); 

    // What action do we use to show the hover 
    var infoAction = "mouseover"; 

    marker.value = mapDetails; 

    google.maps.Event.addListener(marker, infoAction, function() { 
     alert(marker.value); 
     map.openInfoWindowHtml(point, getResultInfoContent(marker.value)); 
    }); 

    mgr.addMarker(marker, 1); 
    } 
    mgr.refresh(); 
} 

「marker.value」最終總是一套作爲什麼mapDetails是最後一個值。如果有的話,我希望它是「未定義的」,因爲一旦循環結束,不應該這個價值消失嗎?我嘗試了各種不同的值(例如marker.value = i + 1;),但它仍然會以兩個點的相同值出現。

有沒有人有任何想法如何將正確的值傳遞給事件監聽器?

回答

6

更改此:

google.maps.Event.addListener(marker, infoAction, function() { 
     alert(marker.value); 
     map.openInfoWindowHtml(point, getResultInfoContent(marker.value)); 
    }); 

這樣:

google.maps.Event.addListener(marker, infoAction, (function(marker, point, map) { return function() { 
     alert(marker.value); 
     map.openInfoWindowHtml(point, getResultInfoContent(marker.value)); 
    }})(marker, point, map)); 

這將創建一個你想要的關閉。

分裂出來的清晰度:

var f = function(marker, point, map) 
{ 
    return function() 
    { 
     alert(marker.value); 
     map.openInfoWindowHtml(point, getResultInfoContent(marker.value)); 
    } 
} 

google.maps.Event.addListener(marker, infoAction, f(marker, point, map)); 
+0

這奏效了。乾杯格雷格。我曾嘗試過類似的東西,但減去了包裝代碼的返回函數(){...}。 – 2009-05-06 12:54:38

3

以上回答是不是很直觀,但 - 格雷戈說。

當您將事件添加到對象時,該對象被傳遞下來,以便您可以通過閉包中的「this」來訪問它。如果您將「marker.value」替換爲「this.value」,您的問題將得到解決。如果你需要傳遞下來更多的東西,你把它綁對象和它向下傳遞:

marker.a = 1 
marker.b = 2 
marker.c = 3 

在封閉this.a將是1等..