也许我正在完全偏离我正在尝试做的事情,但我很想回到第2版,因为我能够轻松地工作(但我想要适合移动设备)。
我正在尝试生成一些标记,为了保存代码,我将标记生成放入for循环中,循环遍历标记数组(有实际值而不是(long,lat,x) ,x,x)在真实数组中。)
有什么事情完全超出我的想法吗?
function initialize() {
var latlng = new google.maps.LatLng(25, 15);
var myOptions = {
zoom: 2,
center: latlng,
mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
var myMarker = new Array();
myMarker[0] = new Array(long,lat,x,x,x);
myMarker[0] = new Array(long,lat,x,x,x);
myMarker[0] = new Array(long,lat,x,x,x);
myMarker[0] = new Array(long,lat,x,x,x);
myMarker[0] = new Array(long,lat,x,x,x);
myMarker[0] = new Array(long,lat,x,x,x);
myMarker[0] = new Array(long,lat,x,x,x);
for(var i = 0; i < myMarker.length; i++) {
var marker = new google.maps.Marker({
position: new google.maps.LatLng(myMarker[i](1), myMarker[i](2)),
map: map,
title: myMarker[i](5)
});
var infowindow = new google.maps.InfoWindow({content: myMarker[i](5)});
google.maps.event.addListener(marker, 'click', function() {
infowindow.open(map,marker);
});
}
}
当我单独制作标记时,此代码有效。
答案 0 :(得分:4)
问题是所有这些监听器功能都共享相同的“map”和“marker”值。你需要将它们包装在另一个函数中:
(function(map, marker) {
google.maps.event.addListener(marker, 'click', function() {
infowindow.open(map,marker);
});
})(map, marker);
“map”和“marker”变量在循环的每次迭代中都会发生变化。那些监听器函数没有它们的副本,除非你明确地设置了一些东西,就像我在那个例子中所做的那样。因此,所有的听众最终都会在循环触及的最后一件事上工作!
编辑 - 实际上现在我再次阅读了代码,“map”看起来并没有改变,所以它可能会从我的设置中删除(虽然没有伤害任何东西)。
答案 1 :(得分:1)
我注意到的一些事情是数组定义并访问它们。例如
// here your defining the array, quick tip just use [] instead of new Array(); its faster, in both execution and to type :)
var myMarker = new Array();
//here your defining the 1st value in the array at the 0 index
myMarker[0] = new Array(long,lat,x,x,x);
//but again here your overriding the first value of the array at 0 index
myMarker[0] = new Array(long,lat,x,x,x);
所以看起来应该更像这个
var myMarker = new Array();
myMarker[0] = new Array(long,lat,x,x,x);
myMarker[1] = new Array(long,lat,x,x,x);
myMarker[2] = new Array(long,lat,x,x,x);
myMarker[3] = new Array(long,lat,x,x,x);
myMarker[4] = new Array(long,lat,x,x,x);
myMarker[5] = new Array(long,lat,x,x,x);
myMarker[6] = new Array(long,lat,x,x,x);
然后当您使用
访问数组中的值时title: myMarker[i](5)
假设每个标记数组中有5个值
,则应该这样title: myMarker[i][4]
javascript中的数组是基于0的索引并使用方括号[]而不是括号。
编辑:语法修正:)
答案 2 :(得分:0)
问题是只有一个marker
值,每个循环迭代都会改变它。事件处理函数不跟踪他们需要哪个标记。
解决此问题的正确方法是知道marker
作为this
传递到事件处理程序中。简单的解决方法是:
google.maps.event.addListener(marker, 'click', function() {
infowindow.open(map, this); // <-- changed 'marker' to 'this'
});