1

a) 最初の本当のジョーク: ついに何年にもわたって Microsoft のものを購入したことが報われました.. Chrome を使用してデバッグしようとすると、私のマップにはマーカーが 1 つしか表示されませんでした。setTimeout の期間中は正しい緯度にあり、ほんの数秒間点滅し、同じ位置に戻りました。ある時点で、誤ってコードを Explorer に送信してしまいました... 出来上がり... コードはデータベースを反復処理しますが、各マーカーに対して setTimeout を使用しません。Explorer では、setTime out (例、5 秒) は、すべてのマーカーが正しい情報ウィンドウと共に表示されることを意味しますが、すべてのマーカーで 5 秒です。時間が長いほど、そのうちの 1 つ (常に同じもの) に留まる時間が長くなり、他のマーカーで非常に高速になります。chrome では、イテレーションが速すぎて、他の latlng のイテレーションを見ることができませんでした。それはただのまばたきでした。

b) 問題は、for ループまたは $.each (あらゆる種類の組み合わせを使用しました.....) のいずれかを使用する getJson (または Ajax) が、関数 changeMarker 内の他のループと組み合わされていることだと思います。したがって、2 つのループが同時に進行しています。しかし、私はそれを修正する方法がわかりません。$.each または for ループの直後に Ajax (または getJson) を閉じると、残りのコードは値を取得しません。何も起こりません (デバッグ目的の私のアラートだけです)。

いいえ、私はクロージャを完全には理解していません。はい、私はたくさんのものを読みました。主なものはこちらですが、ここここそこもあります。しかし、まだそれを理解していませんでした:/

c) 何日も問題を解決しようとしているのに、初心者であることは容易ではありません。

どんな助けでも大歓迎です!

これがコードです - map が個人的なオプションを取得する長いセクションを省略しました。

var BERLIN = new google.maps.LatLng(-32.517683, -46.394393);
var map = null;
var marker = null;
var index = 0;
var infoWindow = null;
var latlng ;
var MY_MAPTYPE_ID = 'custom_style';


function initialize() {

    //personal options not included here. 

    var customMapType = new google.maps.StyledMapType(featureOpts, styledMapOptions);

    map.mapTypes.set(MY_MAPTYPE_ID, customMapType);

    $.getJSON('php/locationsJson.php',function(json){
        $.each( json, function(i, item) {
            var lat = this.lat;
            var lng = this.lng;

            var location  = new google.maps.LatLng(json[i].lat,json[i].lng);                    

            alert( json[i].lat +','+json[i].lng );

            function dropMarker (map, pos){
                return new google.maps.Marker({
                    map: map,
                    position: location,
                    draggable: false,
                }); // return
            }

            function changeMarker() {   

                if (marker) {
                    infoWindow.close();
                    marker.setMap(null);
                }

                var pos = location[index];
                marker = dropMarker(map,pos);
                var contentString = ('lat: ' + location.lat() + '<br />' + 'lng: ' + location.lng())

                infoWindow.setContent(contentString);

                setTimeout(function () {
                    infoWindow.open(map, marker);
                }, 100);

                index = (index + 1) % json.length;

                setTimeout(function () {
                    changeMarker();
                }, 4000);
            } 

            var customMapType = new google.maps.StyledMapType(featureOpts, styledMapOptions);

            infoWindow = new google.maps.InfoWindow()

            changeMarker(); 
        }); //$.each                
    }); //end of getjson   
}  //end of initialized

これは、AJAXの前のコードのフィドルです(その点に到達するための助けに感謝します)。json ファイルをフィドルに追加しようとしましたが、複雑すぎてフィドル内に json を追加できません。

お時間をいただきありがとうございました。

4

1 に答える 1

2

フィドルでのアプローチはうまく機能する
ため、ajax を介してそれを達成するために多くの変更を加える必要はありません。

ループ内でタイムアウトを開始する代わりに、ループを使用して NEIGBORHOODS-array を設定し、ループ呼び出しの後にのみ使用します。changeMarker()

$.getJSON の成功コールバック:

function(json){

  NEIGBORHOODS=[];
  $.each(json,
         function(){
           NEIGBORHOODS.push(new google.maps.LatLng(this.lat,this.lng));
  });
  changeMarker();

}

コードの残りの部分は、そのままフィドルのままにすることができます。

ajax-request で作業フィドル: http://jsfiddle.net/doktormolle/CVECG/

$.post()(注: jsfiddleはJSONのポストリクエストを必要とするため、私が使用したフィドル$.getJSONでは、アプリケーションで使用できます)

于 2013-07-04T01:25:39.533 に答える