1

a) 首先是真正的笑话:这些年来购买微软的东西终于得到了回报。尝试使用 Chrome 进行调试时,我的地图只显示了一个标记。它在 setTimeout 期间处于正确的纬度上,闪烁一小段时间,回到相同的位置。在某个时间,错误地将代码发送到资源管理器............瞧......代码遍历数据库,但不使用每个标记的 setTimeout。在 Explorer 中,setTime out (Ex, 5 seconds) 意味着所有标记都会显示,并带有正确的信息窗口,但所有标记都是 5 秒。时间越长,它会在其中一个中停留的时间越长(总是相同的),在其他标记上运行得非常快。在 chrome 中,迭代是如此之快,我无法通过其他 latlng 看到迭代。只是眨眼。

b)我猜问题是getJson(或Ajax),使用for循环或$ .each(我使用了各种组合......)与函数changeMarker中的另一个循环结合在一起。所以有两个循环同时进行。但是,我不知道如何解决它。如果我在 $.each 或 for 循环之后立即关闭 Ajax(或 getJson),则其余代码将无法获取值。什么都没有发生(只是我的警报,用于调试目的)。

不,我不完全理解闭包。是的,我读了很多东西,主要的在这里,但也在这里这里那里。但仍然没有弄清楚:/

c) 作为一个新手,想解决一个问题好几天……却没有得到解决,这并不容易。

任何帮助将不胜感激!

这是代码 - 省略了很长的部分,其中 map 获取个人选项。

var BERLIN = new google.maps.LatLng(-32.517683, -46.394393);
var map = null;
var marker = null;
var index = 0;
var infoWindow = null;
var latlng ;
var MY_MAPTYPE_ID = 'custom_style';


function initialize() {

    //personal options not included here. 

    var customMapType = new google.maps.StyledMapType(featureOpts, styledMapOptions);

    map.mapTypes.set(MY_MAPTYPE_ID, customMapType);

    $.getJSON('php/locationsJson.php',function(json){
        $.each( json, function(i, item) {
            var lat = this.lat;
            var lng = this.lng;

            var location  = new google.maps.LatLng(json[i].lat,json[i].lng);                    

            alert( json[i].lat +','+json[i].lng );

            function dropMarker (map, pos){
                return new google.maps.Marker({
                    map: map,
                    position: location,
                    draggable: false,
                }); // return
            }

            function changeMarker() {   

                if (marker) {
                    infoWindow.close();
                    marker.setMap(null);
                }

                var pos = location[index];
                marker = dropMarker(map,pos);
                var contentString = ('lat: ' + location.lat() + '<br />' + 'lng: ' + location.lng())

                infoWindow.setContent(contentString);

                setTimeout(function () {
                    infoWindow.open(map, marker);
                }, 100);

                index = (index + 1) % json.length;

                setTimeout(function () {
                    changeMarker();
                }, 4000);
            } 

            var customMapType = new google.maps.StyledMapType(featureOpts, styledMapOptions);

            infoWindow = new google.maps.InfoWindow()

            changeMarker(); 
        }); //$.each                
    }); //end of getjson   
}  //end of initialized

这是AJAX 之前的代码的小提琴 (感谢您的帮助)。我尝试在小提琴中添加json文件,但是在小提琴中添加json太复杂了。

再次感谢您的宝贵时间。

4

1 回答 1

2

由于您在小提琴中的方法工作正常,因此您不需要太多修改即可
通过 ajax 实现它。

不要在循环内开始超时,而是使用循环仅填充 NEIGBORHOODS 数组,并在循环调用之后changeMarker()

$.getJSON 的成功回调:

function(json){

  NEIGBORHOODS=[];
  $.each(json,
         function(){
           NEIGBORHOODS.push(new google.maps.LatLng(this.lat,this.lng));
  });
  changeMarker();

}

其余代码可能会保持原样。

使用 ajax 请求的小提琴:http: //jsfiddle.net/doktormolle/CVECG/

(注意:在我使用的小提琴中,$.post()因为 jsfiddle 需要 JSON 的后请求,您可以$.getJSON在您的应用程序中使用)

于 2013-07-04T01:25:39.533 回答