0

少し問題があります。マークのタイトルを除いてすべてが正常に動作するように見える次のコードがあります。アレイ リストの最後のタイトルが常に表示されます。誰かがこのエラーの理由を知っていますか?

コード:

$(document).ready(function() {

            var options = {
                zoom: 7,
                center: new google.maps.LatLng(42.19708, 2.19075),
                mapTypeId: google.maps.MapTypeId.ROADMAP,
                mapTypeControl: true
            };

            var geocoder = new google.maps.Geocoder();
            var map = new google.maps.Map(document.getElementById('map_canvas'), options);

            var companys = [
                ['Giga S.L', 'Plaça de Catalunya, Barcelona'],
                ['Torre M', 'Plaça d\'Espanya, Barcelona']
            ];

            var address;
            var title;

            for (var i = 0; i < companys.length; i++) {
                address = companys[i][1];
                title = companys[i][0];

                geocoder.geocode({'address': address}, function(results, status) {
                    if (status === google.maps.GeocoderStatus.OK) {
                        map.setCenter(results[0].geometry.location);

                        new google.maps.Marker({
                            map: map,
                            animation: google.maps.Animation.DROP,
                            position: results[0].geometry.location,
                            title: title // ERROR: ALWAYS THE SAME TITLE
                        });
                    } else {
                        alert('Geocode was not successful for the following reason: ' + status);
                    }
                });
            }
        });

前もって感謝します。

よろしくお願いします。

4

2 に答える 2

1

geocoder.geocodeコールバック機能があります。これは、コードが非同期で実行されることを意味します。コールバック内から会社のタイトルを取得するには、コードを再構築する必要があります。

コードでは、geocodeコールバックが返される前に for ループが既に終了しているため、変数 title が最後のものに設定されています。

于 2013-09-26T11:18:25.920 に答える
1

これを解決する 1 つの方法は、呼び出しをすぐに呼び出される関数式 (IFFE) でラップgeocode変数をパラメーターとして渡すことです。

(function(address, title) { // the variables are passed in here as function parameters

  geocoder.geocode({'address': address}, function(results, status) {
    if (status === google.maps.GeocoderStatus.OK) {
      map.setCenter(results[0].geometry.location);

      new google.maps.Marker({
        map: map,
        animation: google.maps.Animation.DROP,
        position: results[0].geometry.location,
        title: title
      });
    } else {
      alert('Geocode was not successful for the following reason: ' + status);
    }
  });

}(address, title)); // pass in address/title into the IFFE
于 2013-09-26T11:29:33.327 に答える