Google Maps Ajax多个标记Json

时间:2015-10-07 18:21:56

标签: javascript ajax google-maps google-maps-api-3 google-maps-markers

我有以下内容:https://jsfiddle.net/inkedraskal/h35dz9qd/5/

我收到错误:无法分配给只读属性'__e3_'为0

我之前有一个for循环,它在for循环之后调用了函数,但是jshint没有接受它。所以现在我正在使用Ajax,但我被卡住了。我可以在控制台中返回对象以及第一个信息框内容(请参阅控制台),然后我收到错误。

js如下:(任何提示,技巧等都会受到赞赏)

(function () {
    renderGoogleMap();


    function renderGoogleMap() {
        var start_point = new google.maps.LatLng(0, 0);

        // Creating a new map
        var map = new google.maps.Map(document.getElementById("locations-map"), {
            center: start_point,
            zoom: 6,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        });



        // Creating a global infoWindow object that will be reused by all markers
        var infoWindow = new google.maps.InfoWindow();

        function setMarkerPoints(map,marker) {
            var bounds = new google.maps.LatLngBounds();
            // Looping through the JSON data

                // Creating a closure to retain the correct data, notice how I pass the current data in the loop into the closure (marker, data)



                $.ajax({
                   type: "GET",
                    url: 'https://raw.githubusercontent.com/roryheaney/jsonexample/master/locatoins.json',
                    dataType: "json",
                    success: function (data) {
                        console.log(data);

                        if (data.length !== 0) {

                         var   latLng = new google.maps.LatLng(data.lat, data.lng);

                        // Creating a marker and putting it on the map
                        var marker = new google.maps.Marker({
                            position: latLng,
                            map: map,
                            title: data.title
                        });


                            $.each(data, function (marker, data) {
                                var windowContent = '<h3>' + data.title + '</h3>' +
                                    '<p>' + data.description + '</p>';
                                console.log(windowContent);

                                // Attaching a click event to the current marker
                                infobox = new InfoBox({
                                    content: infoWindow.setContent(windowContent),
                                    alignBottom: true,
                                    pixelOffset: new google.maps.Size(-160, -45)
                                });

                                google.maps.event.addListener(marker, 'click', function () {

                                    // Open this map's infobox
                                    infobox.open(map, marker);
                                    infobox.setContent(windowContent);
                                    map.panTo(marker.getPosition());
                                    infobox.show();
                                });
                                google.maps.event.addListener(map, 'click', function () {
                                    infobox.setMap(null);
                                });
                            });

                        } 


                    },
                    error: function (data) {
                        // alert('Please refresh the page and try again');

                        console.log('Please refresh the page and try again');
                    }

                });
                //END MARKER DATA


                // bounds.extend(marker.getPosition());

            // end loop through json

            map.setCenter(start_point);
            map.fitBounds(bounds);
        }
        setMarkerPoints(map);
    }

})();

1 个答案:

答案 0 :(得分:2)

更改列表:

1.Google Maps API包含自己在加载页面后触发的事件,因此我更换了这些行:

(function () {
    renderGoogleMap();

    //...


})();

function renderGoogleMap() {
    //...
  }

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

2.已添加标记lat / lng边界的初始化。

3.还有一些小修正。

<强> Working example

代码段

function renderGoogleMap() {
  var start_point = new google.maps.LatLng(0, 0);

  // Creating a new map
  var map = new google.maps.Map(document.getElementById("locations-map"), {
    center: start_point,
    zoom: 6,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  });



  // Creating a global infoWindow object that will be reused by all markers
  var infoWindow = new google.maps.InfoWindow();

  function setMarkerPoints(map, marker) {
    var bounds = new google.maps.LatLngBounds();


    $.ajax({
      type: "GET",
      url: 'https://raw.githubusercontent.com/roryheaney/jsonexample/master/locatoins.json',
      dataType: "json",
      success: function(data) {

        if (data.length !== 0) {


          $.each(data, function(marker, data) {


            var latLng = new google.maps.LatLng(data.lat, data.lng);
            bounds.extend(latLng);

            // Creating a marker and putting it on the map
            var marker = new google.maps.Marker({
              position: latLng,
              map: map,
              title: data.title
            });


            var windowContent = '<h3>' + data.title + '</h3>' +
              '<p>' + data.description + '</p>';

            // Attaching a click event to the current marker
            infobox = new InfoBox({
              content: infoWindow.setContent(windowContent),
              alignBottom: true,
              pixelOffset: new google.maps.Size(-160, -45)
            });

            google.maps.event.addListener(marker, 'click', function() {

              // Open this map's infobox
              infobox.open(map, marker);
              infobox.setContent(windowContent);
              map.panTo(marker.getPosition());
              infobox.show();
            });
            google.maps.event.addListener(map, 'click', function() {
              infobox.setMap(null);
            });
          });
          map.fitBounds(bounds);

        }

      },
      error: function(data) {
        console.log('Please refresh the page and try again');
      }
    });
    //END MARKER DATA

    // end loop through json

  }
  setMarkerPoints(map);
}


google.maps.event.addDomListener(window, 'load', renderGoogleMap);
// renderGoogleMap();
#locations-map {
  display: block;
  height: 500px;
}
.infoBox {
  max-width: 300px;
  background: #fff;
  padding: 10px;
  border: 1px solid red;
}
.infoBox img {
  border: 1px solid yellow;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="https://maps.googleapis.com/maps/api/js"></script>
<script src="https://google-maps-utility-library-v3.googlecode.com/svn/trunk/infobox/src/infobox.js"></script>
<div id="locations-map"></div>