Google Maps API v3 For loop Trouble

时间:2010-07-09 20:31:27

标签: javascript arrays api google-maps for-loop

也许我正在完全偏离我正在尝试做的事情,但我很想回到第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);
    });
}

}

当我单独制作标记时,此代码有效。

3 个答案:

答案 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'
});