2009-07-03 93 views
1

我有一個頁面,它可以檢索一組位置和一些關於其關聯標記的數據,並將它們放在Google Maps地圖上。點擊時,每個人都應該彈出自己的小信息。但是,單擊其中的任何一項都會使最近添加的消息在最近添加的標記上彈出。是什麼賦予了?我沒有正確編寫點擊事件腳本嗎?這裏是相關的代碼:Google Maps API,所有標記打開相同的infowindow

var xmlDoc; 
    if (window.XMLHttpRequest) 
    { 
    xmlDoc=new window.XMLHttpRequest(); 
    xmlDoc.open("GET","locs.php",false); 
    xmlDoc.send(""); 
    xmlDoc=xmlDoc.responseXML; 
    } 
    // IE 5 and IE 6 
    else if (ActiveXObject("Microsoft.XMLDOM")) 
    { 
    xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); 
    xmlDoc.async=false; 
    xmlDoc.load("locs.php"); 
    } 

    var pins = xmlDoc.getElementsByTagName("pin"); 
    //alert(pins); 

    for (i=0;i<pins.length;i++) 
    { 
     //alert(pins[i].getElementsByTagName("lat")[0].childNodes[0].nodeValue); 
     var point = new GLatLng(pins[i].getElementsByTagName("lat")[0].childNodes[0].nodeValue, 
           pins[i].getElementsByTagName("lon")[0].childNodes[0].nodeValue); 
     var colord; 
     var curgender = pins[i].getElementsByTagName("gender")[0].childNodes[0].nodeValue; 
     if(curgender == "Male") 
     {colord = blueOpt;}else if(curgender=="Female"){colord = pinkOpt;}else{colord = purpleOpt;} 

     var marker = new GMarker(point, colord); 
     var mess = pins[i].getElementsByTagName("message")[0].childNodes[0].nodeValue; 

     GEvent.addListener(marker, "click", function() { 
     marker.openInfoWindowHtml(mess); 
     }); 

     map.addOverlay(marker); 

    } 
    } 

回答

5

DAFF是正確的大約範圍。但是,一種替代方法是使用bindInfoWindowHtml()而不是使用openInfoWindowHtml()的偵聽器。只是這個代碼替換聽衆:

marker.bindInfoWindowHtml(mess); 


UPDATE:一點題外話 - 因爲 closure,在創建for循環的變量都會被記住。直接解決這個問題的方法是創建一個獨立的函數來創建監聽器。

createMarker(marker,mess); 

更換監聽器,並添加功能:

function createMarker(marker, mess) { 
    GEvent.addListener(marker, "click", function() { 
     marker.openInfoWindowHtml(mess); 
    }); 
} 
+1

謝謝你,謝謝你,謝謝你。這正是我所需要的,但無法找到的。 – Jake 2009-07-03 18:54:03

0

我也曾經這樣做過。這是一個範圍界定問題。我不得不改變我的結構一點點,但也許在你的情況改變的回調可能已經幫助:

GEvent.addListener(marker, "click", function() { 
marker.openInfoWindowHtml(pins[i].getElementsByTagName("message")[0].childNodes[0].nodeValue;); 
}); 
相關問題