JavaScript& Google Maps v3:捕获tilesloaded()事件的结果?

时间:2011-01-11 22:34:00

标签: javascript google-maps google-maps-api-3

我遇到了Javascript的异步性和谷歌地图的问题。我正在使用Google Maps V3 tilesloaded收听者向地图添加一些标记。

我不知道如何掌握这些标记,以便我以后可以用它们做事,因为tileloaded异步激发,我是一个Javascript新手!

以下是代码:

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,因为show_place在加载所有标记之前返回。我无法掌握已添加的额外标记。

我怎样才能解决这个问题?

感谢。

3 个答案:

答案 0 :(得分:1)

你应该这样做:

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

答案 1 :(得分:0)

您可能已经在变量中有标记,但是当您在

中请求长度时
$(document).ready(function ...)

长度始终为一(1),因为您插入了标记,内部函数仅在完成执行后一直加载图块后触发。你的show_place()不应该返回任何内容。但是,如果您想提醒用户您上传了数据,您可以将代码放在内部“回调”函数中,或者在回调函数块中调用声明的函数。

答案 2 :(得分:0)

1-我认为您可以在从函数返回值时创建公共变量 2-请检查firebug控制台内部是否有问题。
3-而不是使用tilesloaded,你可以使用idle或bounds_changed(更好地避免因为谷歌多次调用此事件)

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