0

Google Maps API V3で作成された地図作成ツールがあります。ユーザーは2つ以上の場所を入力して地図とルートを作成できます。私はまた、クリックすると近くの注目点を示すマーカーを表示するチェックボックスを持っています。Google Maps API v3マーカーのみがロードされる場合があります

初めてツールを作成したときは、毎回うまく機能すると思います。しかし、最近では、チェックボックスをクリックしたときにマーカーが常に表示されるとは限りません。マップとルーティングは正常に機能しますが、マーカーは時折しか動作しません。このエラーは、動作しない場合に発生するようです。

Uncaught ReferenceError: map is not defined 

これは、javascriptの「cmarkers」セクションのセクションを参照しています(下記参照)。

背景詳細:これは、Rails Webアプリケーションの一部であり、「旅程」と呼ばれるウェブページ/レイアウトの一部です。旅程のWebページに移動して[Map Maker]アイコンをクリックすると、マップ作成ツールが表示されます。これはiフレームに読み込まれ、 "map.html.erb"と呼ばれ、マップビューは/ views/itinerariesにあります。ただし、地図メーカーのすべてのjavascriptは、旅行計画ファイルに収められています。

これらの記事をレビューした結果、コードを注文したり初期化したことがあるかもしれないと思います。主な原因はコードの「cmarkers」セクションにある可能性が高いと思います。

私はいくつかの異なる変化を試してみたが、それぞれが働いたか、初期化からマップを停止していませんどちらか。ここに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"}}] 

答えて

0

私は初期内部cmarkersコードを移動することによって、この問題を解決することができました。私は、javascriptは、初期化のマップ変数がcmarkers関数のマップ変数であったことを明確にしていないと思います(言語が正確でない場合は申し訳ありません、私は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; 
        }); 
        }); 
       }); 
      }; 

特別クレジットこの記事に私のアイデアを与えるために:can't see google marker

関連する問題