我有一个页面可以检索一堆位置和一些有关其相关标记的数据,并将它们放在Google地图上。每个人都应该在点击时弹出自己的小消息。但是,单击其中任何一个会使最近添加的消息弹出最近添加的标记。是什么赋予了?我没有正确编写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);
}
}
答案 0 :(得分:5)
Daff对范围是正确的。但是,另一种方法是使用bindInfoWindowHtml()而不是openInfoWindowHtml()的侦听器。只需用以下代码替换侦听器:
marker.bindInfoWindowHtml(mess);
<小时/> 更新:作为旁注 - 由于closure,将记住在for循环中创建的任何变量。该问题的直接解决方案是创建一个单独的函数来创建监听器。
用
替换侦听器createMarker(marker,mess);
并添加功能:
function createMarker(marker, mess) {
GEvent.addListener(marker, "click", function() {
marker.openInfoWindowHtml(mess);
});
}
答案 1 :(得分:0)
我也有过一次。这是一个范围问题。我不得不改变我的结构,但也许在你的情况下改变回调可能已经有所帮助:
GEvent.addListener(marker, "click", function() {
marker.openInfoWindowHtml(pins[i].getElementsByTagName("message")[0].childNodes[0].nodeValue;);
});