我想为每个生成的标记添加一个Listener事件,这样当您单击标记时,您将被重定向到永久链接URL。使用下面的代码,每个标记的永久链接值都是相同的(它是最后一个值)。我已经阅读过关闭问题,这似乎就是我所拥有的。我并没有真正得到我看过的例子。
有人可以看看我的代码并指出我正确的方向吗?非常感谢任何帮助!
downloadUrl("http://localhost/map/generatexml.php", function(data) {
var xml = parseXml(data);
var markers = xml.documentElement.getElementsByTagName("marker");
for (var i = 0; i < markers.length; i++) {
var permalink = markers[i].getAttribute("permalink");
var point = new google.maps.LatLng(
parseFloat(markers[i].getAttribute("lat")),
parseFloat(markers[i].getAttribute("lng")));
var marker = new google.maps.Marker({map: map,position: point,icon: icon.icon,shadow: icon.shadow,title: name});
google.maps.event.addListener(marker, 'click', function() {self.location.href = permalink;});
}
答案 0 :(得分:11)
试试这个:
for (var i = 0; i < markers.length; ++i) {
// ... like what you have already ...
(function(permalink) {
google.maps.event.addListener(marker, 'click', function() {self.location.href = permalink;});
})(permalink);
}
通过在每次迭代中创建一个带有“永久链接”值副本的新词法范围,您的处理程序应该能够更好地工作。
答案 1 :(得分:2)
JavaScript只有函数作用域,所以当你在for循环中声明var时,你实际上只是为整个函数声明了一次。你应该做的第一件事是将所有的var声明带到顶部,以便更好地了解正在发生的事情:
downloadUrl("http://localhost/map/generatexml.php", function(data) {
var xml = parseXml(data);
var markers = xml.documentElement.getElementsByTagName("marker");
var i, permalink, point, marker;
for (i = 0; i < markers.length; i++) {
permalink = markers[i].getAttribute("permalink");
point = new google.maps.LatLng(
parseFloat(markers[i].getAttribute("lat")),
parseFloat(markers[i].getAttribute("lng")));
marker = new google.maps.Marker({map: map,position: point,icon: icon.icon,shadow: icon.shadow,title: name});
google.maps.event.addListener(marker, 'click', function() {self.location.href = permalink;});
}
您的点击功能将为每个标记事件使用永久链接的最终值,因为每次for循环循环时,永久链接都会被替换为新值。
编辑:所以是的,Pointy打败我实际解决你的问题。但至少你有一个问题的解释
答案 2 :(得分:1)
我们必须使用闭包来解决这个问题
使用以下代码段将信息窗口添加到标记
function AddInfoWidnow(marker,message)
{
var infowindow = new google.maps.InfoWindow({ content: message });
google.maps.event.addListener(marker, 'click', function() {
infowindow.open(marker.get('map'), marker);
});
}
要查看工作示例,请参阅here