2011-01-11 15 views
1

Javascriptの非同期性とGoogleマップに問題があります。 GoogleマップV3 tilesloadedリスナーを使用して、マーカーにマーカーを追加しています。JavaScript&Google Maps v3:tilesloaded()イベントの結果をキャプチャしますか?

これらのマーカーを取得する方法がわからないので、後でそれらを使って操作できます。なぜなら、tilesloadedは非同期的に発生するため、私はJavascript初心者です!それはすべてのマーカーをロードする前にshow_placeが戻っているので、

function show_place() { 
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions); 
    var marker = addMarker(lat, lng); 
    markers.push(marker); 
    // When the map boundaries move, add new markers within the bounds. 
    google.maps.event.addListener(map, 'tilesloaded', function() { 
     var bounds = map.getBounds(); 
     $.getJSON("/markers_within_bounds/", { [variables] }, function(json){ 
     for (i=0;i<json.length;i++) { 
       var map_marker = addMarker(json[i].lat, json[i].lng); 
        markers.push(map_marker); //Try to add markers to the array. Fail. 
     } 
     }); 
    }); 
    return markers; 
} 
$(document).ready(function() { 
    var markers = show_place(lat, lng); 
    alert(markers.length); 
    // Do things with the markers... if there is more than 1. 
}); 

アラートは常に1を示しています

は、ここでは、コードです。私は追加された余分なマーカーを手に入れることができません。

どうすればこの問題を解決できますか?

ありがとうございました。

答えて

0

あなたはすでに変数にマーカーを持っているかもしれませんが、あなたは

$(document).ready(function ...) 

で長さを要求するときにマーカーを挿入ので、長さは常にだけ火事の後、内部機能1(1)になりますshow_place()の実行が終了している間、タイルがすべてロードされています。あなたのshow_place()は何も返してはいけません。ただし、データをアップロードしたことをユーザーに警告する場合は、コードを内部の「コールバック」関数内に置くか、コールバック関数ブロック内の宣言された関数を呼び出します。

1

あなたはこのようにそれを行う必要があります。

var marker = new google.maps.Marker({ 
    position: point, 
    title: 'mytitle' 
}); 
marker.setMap(myMap); 
markersArray.push(marker); 
0

1 - 私はあなたがあなたの関数から値を返すに代わりにパブリック変数を作ることができると思います。
2-火薬庫の内部を調べて問題があるかどうか確認してください。 (Googleがこのイベントを何度も呼び出すので、避けた方が良い)
、3-代わりのtilesloaded使用して、

var markerList = []; 
function (data){//AJAX CALLBACK FUNCTION 
    //EMPTY THE LIST & CLEAR THE MARKER FROM MAP 
    for (var i = 0; i < markerList.length; i++) { 
    markerList[i].setMap(); 
    }; 
    markerList.length = 0; 
    markerList[i] = new google.maps.Marker({ 
    map: map, 
    position: new google.maps.LatLng(data[i].geo_latitude, data[i].geo_longitude), 
    title: data[i].fn 
    }); 
}; 
アイドルかのbounds_changed使用することができます
関連する問題