3

嗨,我在 JavaScript 中使用带有 for 的数组时遇到了一些问题。我们来看一下:

var Villes = [
  ['Versailles+France', 'upr2.png'],
  ['Paris+France', 'upr5.png'],
  ['Bruxelle+Belgique', 'upr4.png'],
  ['Manchester+Angleterre', 'upr1.png'],
  ['Monaco+Monaco', 'upr3.png']
];

function initialize() {
  var mapOptions = {
    zoom: 5,
    center: new google.maps.LatLng(46.225453,2.219238),
    mapTypeId: google.maps.MapTypeId.ROADMAP
  };
  var map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);
  var geocoder = new google.maps.Geocoder();
  for (var i = 0; i < Villes.length; i++) {
    var ville = Villes[i];
    geocoder.geocode( { 'address': ville[0]}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        var marker = new google.maps.Marker({position: results[0].geometry.location,map: map,icon: ville[1]});
        alert(ville[1] + status);
      } else {
        alert("Geocode n'a pas fonctionner. Erreur: " + status);
      }
    });
  }
}

我的地图带有我所有的标记,但图标永远不会改变,就像对我不习惯 JSville[1]的静态调用一样,这是我第一次看到它。upr3.png

4

3 回答 3

1

到你给的回调geocode被调用时,i它的值是循环结束。

通常的通用解决方案是通过立即调用的函数表达式来保护它:

for (var i = 0; i < Villes.length; i++) {
     (function(ville){
        geocoder.geocode( { 'address': ville[0]}, function(results, status)
           ...
        });
     })(Villes[i]);
}

由于变量的范围是声明它的函数,这使得新变量ville不受循环变化的影响。

于 2013-03-25T13:05:52.813 回答
0

问题是它ville不是一个数组,所以当 for 循环完成时,ville只有初始数组 (png3) 中最后一项的值。您需要在将值设置为后立即调用该函数ville

于 2013-03-25T13:07:05.870 回答
0

调用是异步的geocode,这意味着您将遍历所有地方并发送请求,然后响应将到达。那个时候你已经跑完了循环,ville变量有最后一个地方的值。

在循环中的代码周围放置一个函数表达式,以便每次迭代都有自己的变量副本:

for (var i = 0; i < Villes.length; i++) {

  (function(ville){

    geocoder.geocode( { 'address': ville[0]}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        var marker = new google.maps.Marker({position: results[0].geometry.location,map: map,icon: ville[1]});
        alert(ville[1] + status);
      } else {
        alert("Geocode n'a pas fonctionner. Erreur: " + status);
      }
    });

  })(Villes[i]);

}
于 2013-03-25T13:09:20.827 回答