【问题标题】:Google Maps API Javascript: Activating infowindows on markers from Places search boxGoogle Maps API Javascript:在地方搜索框中的标记上激活信息窗口
【发布时间】:2016-02-06 03:55:56
【问题描述】:

我严格按照 Google 开发者documentation 实现了一个地方搜索框。标记将根据特定的搜索词(例如“餐厅”)显示在地图上。当然,我想在用户单击标记时显示一个信息窗口,以实际向用户提供有关该地点的一些信息。我已关注 Google 开发人员 documentation 以激活 infowindows,但没有任何成功(我在代码中所做的更改由 cmets 1、2 和 3 说明)。

这里之前的帖子也没有帮助我。任何帮助将不胜感激。

<script>

function initMap() {
  var map = new google.maps.Map(document.getElementById('map'), {
    center: {lat: -33.8688, lng: 151.2195},
    zoom: 13,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  });


var input = document.getElementById('pac-input');
var searchBox = new google.maps.places.SearchBox(input);
map.controls[google.maps.ControlPosition.TOP_LEFT].push(input);


map.addListener('bounds_changed', function() {
    searchBox.setBounds(map.getBounds());
});


// 1: Variables infowindow and service:

var infowindow = new google.maps.InfoWindow();
var service = new google.maps.places.PlacesService(map);

var markers = [];

searchBox.addListener('places_changed', function() {
   var places = searchBox.getPlaces(); 

    if (places.length == 0) {
      return;
    }

    markers.forEach(function(marker) {
      marker.setMap(null);
    });
    markers = [];

    var bounds = new google.maps.LatLngBounds();

  places.forEach(function(place) {
      var icon = {
        url: place.icon,
        size: new google.maps.Size(71, 71),
        origin: new google.maps.Point(0, 0),
        anchor: new google.maps.Point(17, 34),
        scaledSize: new google.maps.Size(25, 25)
      };

      markers.push(new google.maps.Marker({
        map: map,
        icon: icon,
        title: place.name,
        position: place.geometry.location
      }));

      if (place.geometry.viewport) {

        bounds.union(place.geometry.viewport);
      } else {
        bounds.extend(place.geometry.location);
      }
  });

// 2: getDetails, referring to the "places" (var places = searchBox.getPlaces();) already on the map
// 3: addlistener on the markers, to show an infowindow upon a clickevent   

  service.getDetails(places, function(place, status) {
    if (status === google.maps.places.PlacesServiceStatus.OK) {
      google.maps.event.addListener(markers, 'click', function() {
        infowindow.setContent('<div><strong>' + place.name + '</strong><br>' +
          'Place ID: ' + place.place_id + '<br>' +
          place.formatted_address + '</div>');
        infowindow.open(map, this);
      });
    }
  });



  map.fitBounds(bounds);
});


}

 </script>

【问题讨论】:

    标签: javascript google-maps-api-3


    【解决方案1】:

    您需要在单击标记时执行详细信息请求(如果您在创建标记时运行所有详细信息请求,则会遇到查询限制)。

    然后在响应返回时打开标记上的信息窗口。

    代码 sn-p:

    function initMap() {
      var map = new google.maps.Map(document.getElementById('map'), {
        center: {
          lat: -33.8688,
          lng: 151.2195
        },
        zoom: 13,
        mapTypeId: google.maps.MapTypeId.ROADMAP
      });
    
    
      var input = document.getElementById('pac-input');
      var searchBox = new google.maps.places.SearchBox(input);
      map.controls[google.maps.ControlPosition.TOP_LEFT].push(input);
      map.addListener('bounds_changed', function() {
        searchBox.setBounds(map.getBounds());
      });
      // 1: Variables infowindow and service:
      var infowindow = new google.maps.InfoWindow();
      var service = new google.maps.places.PlacesService(map);
      var markers = [];
      searchBox.addListener('places_changed', function() {
        var places = searchBox.getPlaces();
        if (places.length == 0) {
          return;
        }
        markers.forEach(function(marker) {
          marker.setMap(null);
        });
        markers = [];
        var bounds = new google.maps.LatLngBounds();
        places.forEach(function(place) {
            var icon = {
              url: place.icon,
              size: new google.maps.Size(71, 71),
              origin: new google.maps.Point(0, 0),
              anchor: new google.maps.Point(17, 34),
              scaledSize: new google.maps.Size(25, 25)
            };
    
            var marker = new google.maps.Marker({
              map: map,
              icon: icon,
              title: place.name,
              position: place.geometry.location,
              placeId: place.place_id
            });
            markers.push(marker);
            google.maps.event.addListener(marker, 'click', function(evt) {
              // 2: getDetails, referring to the "places" (var places = searchBox.getPlaces();) already on the map
              // 3: addlistener on the markers, to show an infowindow upon a clickevent   
    
              service.getDetails({
                placeId: this.placeId
              }, (function(marker) {
                return function(place, status) {
                  if (status === google.maps.places.PlacesServiceStatus.OK) {
                    infowindow.setContent('<div><strong>' + place.name + '</strong><br>' +
                      'Place ID: ' + place.place_id + '<br>' +
                      place.formatted_address + '</div>');
                    infowindow.open(map, marker);
                  }
                }
              }(marker)));
            });
            if (place.geometry.location) {
              bounds.extend(place.geometry.location);
            }
          })
          // map.fitBounds(bounds);
      });
    }
    google.maps.event.addDomListener(window, "load", initMap);
    html,
    body,
    #map {
      height: 100%;
      width: 100%;
      margin: 0px;
      padding: 0px
    }
    <script src="https://maps.googleapis.com/maps/api/js?libraries=places"></script>
    <input id="pac-input" type="text" />
    <div id="map"></div>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      • 2014-05-14
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      相关资源
      最近更新 更多