繁体   English   中英

Google Maps API v3标记有时只会加载

[英]Google Maps API v3 Markers only load sometimes

我有一个使用Google Maps API V3构建的地图制作工具。 它允许用户输入两个或多个位置并生成地图和路线。 我还有一个复选框,单击该复选框可显示指示附近的景点的标记。

当我第一次构建该工具时,我认为它每次都运行良好。 不过,最近我注意到,单击复选框时,标记并不总是出现。 地图和路线可以正常工作,但标记仅偶尔起作用。 当它们不起作用时,似乎会发生此错误:

Uncaught ReferenceError: map is not defined

它引用了javascript的“标记”部分的一部分(请参见下文)。

背景详细信息:这是Rails Web应用程序和称为“行程”的网页/布局的一部分。 当您进入路线网页并单击“地图制作器”图标时,将显示地图制作工具。 它加载在i框架中,称为“ map.html.erb”,地图视图位于/ views / itineraries中。 但是,地图制作者的所有JavaScript都位于“路线”布局文件中。

基于对这些帖子的回顾,我认为这可能是我订购或初始化代码的方式,并且我认为,罪魁祸首可能在代码的“标记”部分。

我尝试了几种不同的更改,但是每种更改都没有起作用或停止了地图的初始化。 这是javascript; 请注意,API密钥和其他小节均已删除。 下面是标记的代码。

        <script src="https://maps.googleapis.com/maps/api/js?key=MYAPIKEY&sensor=false"></script>
    <script type='text/javascript'> 
    $(function(){
        var directionsDisplay;
        var map;            

        function overlaysClear() {
          if (markersArray) {
            for( var i = 0, n = markersArray.length; i < n; ++i ) {
              markersArray[i].setVisible(false);
            }
          }
        }

        function overlaysShow() {
          if (markersArray) {
            for( var i = 0, n = markersArray.length; i < n; ++i ) {
              markersArray[i].setVisible(true);
            }
          }
        }

        $("#showmapview").click(function() {
        overlaysClear();
        $('#mapeach').attr('checked', false);
        });

        $('#mapeach').change(function() {
         if( $('#mapeach').attr("checked")) {
                  overlaysShow();
                  }
                  else  {
                  overlaysClear();
                  }
        });
        cmarkers();

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

    var directionsService = new google.maps.DirectionsService();
        var markersArray = [];
        var arrInfoWindows = null;

    function initialize() {
          var rendererOptions = {
          draggable: true,
          panel:document.getElementById('directions_panel')
         };

          directionsDisplay = new google.maps.DirectionsRenderer(rendererOptions);
          var chicago = new google.maps.LatLng(41.850033, -87.6500523);
              var mapOptions = {
              zoom: 6,
              center: chicago,
              mapTypeId: google.maps.MapTypeId.ROADMAP
            }
          map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);

          directionsDisplay.setMap(map);
        }

        function calcRoute() {

            var start = document.getElementById("start").value;
            var end = document.getElementById("end").value;
            var waypts = [];
          var checkboxArray = document.getElementById("waypoints");
          for (var i = 0; i < checkboxArray.length; i++) {
             waypts.push({
                  location:checkboxArray[i].value,
                  stopover:true
              });
         }

          var request = {
              origin: start,
              destination: end,
              waypoints: waypts,
              optimizeWaypoints: optimize,
              travelMode: google.maps.TravelMode.DRIVING
          };
          directionsService.route(request, function(response, status) {
            if (status == google.maps.DirectionsStatus.OK) {
              directionsDisplay.setDirections(response);
              var route = response.routes[0];
            }    
          });
        }; 

        function cmarkers() {
                    $.getJSON( "/mapeach.js", {}, function( data ) {
                    $.each( data, function( i, item ) {
                    var loc = item.mainlocation;
                    $("#markers").append('<li><a href="#" rel="' + i + '">' + loc.nickname + '</a></li>');
                    var marker = new google.maps.Marker({
                    position: new google.maps.LatLng(+loc.latitude, +loc.longitude),
                    map: map,
                    title: loc.nickname,
                    });
                    markersArray.push(marker);

                      var infowindow = new google.maps.InfoWindow({
                            content: '<a class="clink" href="/spots/'+ loc.id +'/'+ loc.nickname +'" target="_blank">'+ loc.nickname +'</a>'
                            });

                    google.maps.event.addListener(marker, 'click', function() {
                         if (arrInfoWindows != null) { 
                            arrInfoWindows.close(); 
                        } 
                        infowindow.open(map,marker);
                        arrInfoWindows = infowindow;
                        });
                      });
                    });
                };  
    </script>

mapeach.js文件的格式如下:

[{"mainlocation":{"latitude":"40.706352","nickname":"First Location","id":100000,"longitude":"-73.987650"}},{"mainlocation":{"latitude":"34.061148","nickname":"Second Location","id":100001,"longitude":"-118.273067"}}]

我可以通过将cmarkers代码移到Initialize中来解决此问题。 我认为javascript并未明确指出initialize中的map变量还是cmarkers函数中的map变量(对不起,如果语言不准确;我对js不太满意)。 见下文:

function initialize() {
              var rendererOptions = {
              draggable: true,
              panel:document.getElementById('directions_panel')
             };

          directionsDisplay = new google.maps.DirectionsRenderer(rendererOptions);
          var chicago = new google.maps.LatLng(41.850033, -87.6500523);
              var mapOptions = {
              zoom: 6,
              center: chicago,
              mapTypeId: google.maps.MapTypeId.ROADMAP
            }
          map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);

          directionsDisplay.setMap(map);

          cmarkers();
          function cmarkers() {
                $.getJSON( "/mapeach.js", {}, function( data ) {
                $.each( data, function( i, item ) {
                var loc = item.mainlocation;
                $("#markers").append('<li><a href="#" rel="' + i + '">' + loc.nickname + '</a></li>');
                var marker = new google.maps.Marker({
                position: new google.maps.LatLng(+loc.latitude, +loc.longitude),
                map: map,
                title: loc.nickname,
                });
                markersArray.push(marker);

                  var infowindow = new google.maps.InfoWindow({
                        content: '<a class="clink" href="/spots/'+ loc.id +'/'+ loc.nickname +'" target="_blank">'+ loc.nickname +'</a>'
                        });

                google.maps.event.addListener(marker, 'click', function() {
                     if (arrInfoWindows != null) { 
                        arrInfoWindows.close(); 
                    } 
                    infowindow.open(map,marker);
                    arrInfoWindows = infowindow;
                    });
                  });
                });
            };  

特别感谢这篇帖子,让我有了一个主意: 看不到Google标记

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM