我遇到了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
在加载所有标记之前返回。我无法掌握已添加的额外标记。
我怎样才能解决这个问题?
感谢。
答案 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
});
};