1

重複の可能性:
javascriptクロージャー内のグローバル変数を変更する

javascript グローバル配列にデータを格納する際に問題があります。いくつかの要素を割り当てたにもかかわらず、配列が空である理由がわかりません。

基本的に私は 2 つの関数を持っています:loadMarkersユーザーがボタンをクリックし、JSON の URL から情報を取得するたびに呼び出され、そのデータを解析してグローバル配列に格納します。もう 1 つの関数はshowMarkers、配列を反復処理してすべてのマーカーを表示するだけですが、その配列は空です!

事前に感謝します。

var markers = [];


function loadMarkers(url) {

    markers = [];
    $.get(url, function(data) {

        var json = jQuery.parseJSON(data);

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

            // parsing json
            var lat = json[i].Latitude;
            var lng = json[i].Longitude;
            var id = json[i].ID;

            console.log(id); // this prints with no problems!

            // create new marker
            var marker = new google.maps.Marker({
                position: new google.maps.LatLng(lat, lng),
                title: id,
                html: "<p>" + "Info for container " + id + "</p>"
            });

            // add marker to markers array        
            markers.push(markers[i]);

            // add info window to marker
            google.maps.event.addListener(marker, "click", function() {
                infoWindow.setContent(this.html);
                infoWindow.open(map, this);
            });
        }
    });
}

function showMarkers() {
    for (i = 0; i < markers.length; i++)
        console.log(markers); // here I get an empty array!
        markers[i].setMap(map);
}
4

3 に答える 3

4

次の行のようです。

markers.push(markers[i]);

代わりに次のようにする必要があります。

markers.push(marker);
于 2012-11-28T16:26:27.287 に答える
2

多分その次のコード

// add marker to markers array        
markers.push(marker); // was markers[i]

コメントの 2 番目の質問に関して、$.get()メソッドは、メソッドの終了後に関数を実行できるようにする jQuery 遅延オブジェクトを返します。

$.get().done( function( ) {
    // your code
});
于 2012-11-28T16:26:22.413 に答える
1

コードにタイプミスがあります:

markers.push(markers[i]);

次のようにする必要があります。

markers.push(marker);

コードを見ただけでこの種のタイプミスを見つけるのは驚くほど難しい場合があります (私たちの脳は、読みたいものを読めるように訓練されているようです)... この場合、この種のエラーをすばやく見つけるための最良の方法は、コードに命令を追加しdebugger;、選択した開発ツールを使用してプログラムの実行を追跡します。

于 2012-11-28T16:27:58.397 に答える