Вопрос по javascript – Google Maps API, все маркеры открывают одно и то же окно

1

У меня есть страница, которая извлекает кучу местоположений и некоторые данные об их связанных маркерах и помещает их на карту Google Maps. Каждый должен выскакивать свое собственное маленькое сообщение при нажатии. Однако, щелкнув ЛЮБОЙ из них, вы увидите всплывающее сообщение с последним добавленным маркером. Что дает? Правильно ли я пишу сценарий события click? Вот соответствующий код:

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

    }
  }

Ваш Ответ

2   ответа
5

Дафф прав насчет сферы. Одна альтернатива, однако, заключается в использованииbindInfoWindowHtml () вместо слушателя с openInfoWindowHtml (). Просто замените слушателя следующим кодом:

marker.bindInfoWindowHtml(mess);


UPDATE:  Как знак - из-заclosureлюбая переменная, созданная в цикле for, будет запомнена. Прямым решением проблемы является создание отдельной функции для создания Слушателя.

Заменить слушателя

createMarker(marker,mess);

и добавьте функцию:

function createMarker(marker, mess) {
    GEvent.addListener(marker, "click", function() {
        marker.openInfoWindowHtml(mess);
    });
}
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Jake
0

У меня это тоже было однажды. Это ограниченная проблема. Мне пришлось немного изменить свою структуру, но, возможно, в вашем случае изменение обратного вызова уже может помочь:

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

Похожие вопросы