【问题标题】:Google Maps v3 -> Database/mysql -> AJAX -> LOOP -> AJAX -> Loop谷歌地图 v3 -> 数据库/mysql -> AJAX -> 循环 -> AJAX -> 循环
【发布时间】:2013-07-01 13:52:49
【问题描述】:

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

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

不,我不完全了解闭包。是的,我读了一堆东西,主要的是here,还有hereherethere。但还是没弄明白:/

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 之前的代码fiddle(感谢您提供的帮助)。我尝试在小提琴中添加json文件,但是在小提琴中添加json太复杂了。

再次感谢您的宝贵时间。

【问题讨论】:

  • 所以你正试图获得与通过 $.getJSON 请求的文件的小提琴相同的结果?
  • 感谢您的提问。是的,结果相同,但在 feddle 中我有一个静态数组。这一个在这里,我有 ajax 到数据库,动态地图。我花了几天时间从静态地图数组到动态地图,因为我无法正确进行迭代。它循环非常快(在 explorer/firefox 中较慢),您可以在其中看到移动的位置,回到一个在那里停留几秒钟的地方,回到一个疯狂的循环。如果不清楚,请告诉我。
  • 我尝试了 Ajax、getJson、不同的循环(每个循环、for 循环),都没有提供所需的结果:一次一个标记,几秒钟与相应的信息窗口,然后转到下一个 latlng。与此类似的东西 (lkozma.net/wpv)。他的情况要复杂得多……

标签: javascript mysql ajax jquery google-maps-api-3


【解决方案1】:

由于您在小提琴中的方法效果很好,因此您不需要太多修改
通过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-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 2013-06-18
  • 2016-12-06
  • 2017-04-11
相关资源
最近更新 更多