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);
      }
    });
  }
}

私のマップにはすべてのマーカーが付属していますが、 JSに慣れていないville[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 に答える