2011-01-11 8 views
1

Ich habe ein Problem mit asynchronen Asynchronität von Javascript und Google Maps. Ich füge einige Markierungen zu einer Karte mit dem Google Maps V3 tilesloaded Listener hinzu.JavaScript & Google Maps v3: Ergebnis des Events "tilesloaded()" erfassen?

Ich weiß nicht, wie man diese Marker bekommt, damit ich später Dinge mit ihnen machen kann, weil Kachel asynchron geladen wird und ich ein Javascript-Neuling bin!

Hier ist der Code:

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

Der Alarm immer 1 zeigt, weil show_place Rückkehr wird, bevor es alle Marker lädt. Ich kann die zusätzlichen Markierungen, die hinzugefügt wurden, nicht erreichen.

Wie kann ich das umgehen?

Danke.

Antwort

0

Sie können bereits die Markierungen in den Variablen haben, aber wenn Sie eine Länge in

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

die Länge sein wird immer anfordern (1), weil Sie die Markierung eingefügt, die innere Funktion nur ausgelöst wird, nachdem die Kacheln wurden geladen, während show_place() die Ausführung beendet hat. Ihr show_place() sollte nichts zurückgeben. Wenn Sie jedoch den Benutzer warnen möchten, dass Sie die Daten hochgeladen haben, würden Sie den Code in die innere "Callback" -Funktion einfügen oder eine deklarierte Funktion im Callback-Funktionsblock aufrufen.

1

Sie sollten das tun dies wie:

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

1- Ich denke, Sie eine öffentliche Variable stattdessen einen Wert von Ihrer Funktion bei der Rückkehr zu machen.
2- Bitte überprüfen Sie in der Firebug-Konsole, ob ein Problem vorliegt.
3- statt tilesloaded zu verwenden, können Sie im Leerlauf oder bounds_changed verwenden (besser zu vermeiden, da die Google diese Veranstaltung oft nennen)

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