谷歌地图Api v3 - map.panTo导致“过多的递归”

时间:2014-02-19 12:54:43

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

我在完成我的脚本时遇到了问题,它使用map.setCenter重新定位每个标记,但我想平移到每个新标记。但是,当我使用panTo功能时,标记不会出现,尽管地图确实显示并平移到每个新标记的位置。 Firebug也给我一个“太多的递归”错误。有人可以帮忙吗?

<script type="text/javascript">

    var map = {};
    var mapOptions;
    var infowindow;
    var marker;
    var lat, lng;
    var latlng;
    var gender;
    var content;
    var i;
    var infos = [];

    $(document).ready(function() {
        initialize();
    });

    function initialize() {

      latlng = new google.maps.LatLng(lat, lng);

      mapOptions = {
        zoom: 7,
        center: latlng,
      }

      map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);

      readJSONData();
    }

    function readJSONData()
    {

        var url = "events.json";
        var data;

        $.ajax({
            async: false,
            cache: false,
            type: "GET",
            dataType: "json",
            url: url,
            success: function(data) {

                i = Math.floor(Math.random() * data.events.length);

                if(data.events[i].gender == "Male") {
                    gender = 'male.png';
                } 
                if(data.events[i].gender == "Female"){
                    gender = 'female.png';
                }

                lat = data.events[i].lat;
                lng = data.events[i].lng;
                latlng = new google.maps.LatLng(lat, lng);

                content =
                '<div class="noscrollbar">'+
                '<div id="content">'+
                  '<div class="inner">'+

                    '<div class="inner-left">'+
                        '<span class="span-padding"><i class="fa fa-map-marker fa-lg"></i></span><br />'+
                        '<span class="span-padding"><i class="fa fa-mobile fa-lg"></i></span><br />'+
                        '<span class="span-padding"><i class="fa fa-music fa-lg"></i></span><br />'+
                        '<span class="span-padding"><i class="fa fa-clock-o fa-lg"></i></span><br />'+
                    '</div>'+

                    '<div class="inner-right">'+
                        '<span class="span-padding">'+data.events[i].lat+', '+data.events[i].lng+'</span><br />'+
                        '<span class="span-padding">'+data.events[i].network+'</span><br />'+
                        '<span class="span-padding">'+data.events[i].tone+'</span><br />'+
                        '<span class="span-padding">'+data.events[i].datetime+'</span><br />'+
                    '</div>'+

                  '</div>'+
                '</div>'+
                '</div>';

                marker = new google.maps.Marker({
                      position: latlng,
                      map: map,
                      icon: gender
                  });

                infowindow = new google.maps.InfoWindow();

                map.panTo(marker.getPosition())

                google.maps.event.addListener(marker,'mouseover', (function(marker,content,infowindow){ 
                    return function() {

                        /* close the previous info-window */
                       closeInfos();

                       infowindow.setContent(content);
                       infowindow.open(map,marker);


                        /* keep the handle, in order to close it on next click event */
                        infos[0]=infowindow;

                    };
                })(marker,content,infowindow));

                google.maps.event.addListener(marker,'mouseout', (function(marker,content,infowindow){ 
                    return function() {

                       closeInfos();

                    };
                })(marker,content,infowindow));



                function closeInfos(){

                   if(infos.length > 0){

                      /* detach the info-window from the marker ... undocumented in the API docs */
                      infos[0].set("marker", null);

                      /* and close it */
                      infos[0].close();

                      /* blank the array */
                      infos.length = 0;
                   }
                }
            }
        });

    }

    google.maps.event.addDomListener(window, 'load', initialize);

    window.setInterval(function(){
      readJSONData();
    }, 5000);

</script>

1 个答案:

答案 0 :(得分:4)

此问题的一个原因是lat方法开头的未定义变量lnginitialize()

function initialize() {

    latlng = new google.maps.LatLng(lat, lng);

    mapOptions = {
    ...

latlng必须定义为某些值。例如:

function initialize() {
    lat = 47.89;
    lng = 13.45;

    latlng = new google.maps.LatLng(lat, lng);
    ...

另一个问题是在代码末尾有一个电话:

google.maps.event.addDomListener(window, 'load', initialize);

应该被注释掉。