Google maps api 3 查找google places autocomplete何时返回零结果

Google maps api 3 查找google places autocomplete何时返回零结果,google-maps-api-3,google-places-api,Google Maps Api 3,Google Places Api,我使用google places自动完成位置建议。现在,这就是我想要的:当用户在google数据库之外的位置键入内容时,即google返回零结果,我需要能够捕获零结果事件,并启动custome autocomplete 当google返回的结果为零时,我该如何查找?如果结果为零,则autocomplete.getPlace()将返回一个状态,但这在place\u changed事件中,只有当用户从下拉列表中选择建议时才会触发该事件。我如何让它在地点变更活动之外工作 这是我使用的代码,请在此基础上

我使用google places自动完成位置建议。现在,这就是我想要的:当用户在google数据库之外的位置键入内容时,即google返回零结果,我需要能够捕获零结果事件,并启动custome autocomplete

当google返回的结果为零时,我该如何查找?如果结果为零,则autocomplete.getPlace()将返回一个状态,但这在place\u changed事件中,只有当用户从下拉列表中选择建议时才会触发该事件。我如何让它在地点变更活动之外工作

这是我使用的代码,请在此基础上给出建议:

autocomplete = new google.maps.places.Autocomplete(input,options);
google.maps.event.addListener(autocomplete, 'place_changed', function() {
   var place = autocomplete.getPlace();
   document.getElementById('place_name').value = place.name;
   document.getElementById('location_lat').value = place.geometry.location.lat();
   document.getElementById('location_lon').value = place.geometry.location.lng();
   document.getElementById('location_add').value = place.formatted_address;
   $('#locationInput').attr('title', place.formatted_address);
});

我认为你的情况可能不同于谷歌返回零结果。您问题中的一个假设是,
place\u changed
事件“仅当[用户]从下拉列表中选择建议时才会触发”,这是不正确的。从
google.maps.places.Autocomplete
类事件文档中更改
place\u

当PlaceResult可用于某个位置时,将触发此事件 用户已选择如果用户输入了 控件未建议,并按Enter键 将触发place_changed事件,该事件包含 名称属性,未定义其他属性。

否则,谷歌应该返回结果,因为用户已经选择了自动完成下拉选项中的一个结果。如果直接用户输入不是驱动您的场景的原因,那么检查零结果不应该仅仅包括检查
google.maps.places.PlaceResult
属性的一个、一些或子集,例如:

  • google.maps.geocoderadescomponent的:
    address\u组件
    数组
  • id
  • name
  • 参考
  • 字符串的
    类型
    数组(例如,[
    政治
    地区
    ]或[
    餐厅
    建立
    • 找到了一个窍门

      AutoComplete
      由输入节点的
      keyup
      事件触发,然后:

      通过
      显示隐藏结果下拉列表:无如果没有结果

      如果有结果,则通过清除
      显示
      样式显示结果下拉列表

      您可以通过
      document.getElementsByClassName('pac-container')[0]
      (本机)或
      $('.pac container')
      (jQuery)获取下拉列表

      因此,只需将下拉列表的
      显示设置为“block”,然后跟踪它以检测结果状态

      从以下内容修改的简单示例:

      
      GoogleMapsJavaScriptAPI v3示例:放置自动完成
      身体{
      字体系列:无衬线;
      字体大小:14px;
      }
      #地图画布{
      高度:400px;
      宽度:600px;
      边缘顶部:0.6em;
      }
      var ns={};//名称空间
      ns.checktimes=0;//一系列的检查时间
      //检查功能
      //@param dropdown:Places.AutoComplete的下拉列表
      //@param msg:显示消息的div
      ns.\u doCheck=函数(下拉列表,消息){
      如果(dropdown.style.display=''){
      msg.innerHTML='有结果?为true';
      ns.checkTimer=null;
      }
      else if(dropdown.style.display==“无”){
      msg.innerHTML='有结果?错误';
      ns.checkTimer=null;
      }否则,如果(ns.checktimes<20){//最多检查10秒
      ns.checktimes++;
      ns.checkTimer=setTimeout(函数(){
      N._doCheck(下拉菜单,消息);
      }, 500);
      }
      }
      函数初始化(){
      变量映射选项={
      中心:新google.maps.LatLng(-33.8688151.2195),
      缩放:13,
      mapTypeId:google.maps.mapTypeId.ROADMAP
      };
      var map=new google.maps.map(document.getElementById('map_canvas'),
      地图选项);
      var input=document.getElementById('searchTextField');
      var autocomplete=new google.maps.places.autocomplete(输入);
      autocomplete.bindTo('bounds',map);
      var infowindow=new google.maps.infowindow();
      var marker=new google.maps.marker({
      地图:地图
      });
      google.maps.event.addListener(自动完成,'place\u changed',函数(){
      infowindow.close();
      var place=autocomplete.getPlace();
      if(place.geometry.viewport){
      map.fitBounds(place.geometry.viewport);
      }否则{
      地图。设置中心(地点。几何。位置);
      map.setZoom(17);//为什么是17?因为它看起来不错。
      }
      var image=new google.maps.MarkerImage(
      place.icon,
      新谷歌地图大小(71,71),
      新的google.maps.Point(0,0),
      新谷歌地图点(17,34),
      新google.maps.Size(35,35));
      marker.setIcon(图像);
      标记器.设置位置(位置.几何.位置);
      var地址=“”;
      if(位置、地址和组件){
      地址=[(place.address\u组件[0]&&
      place.address_components[0]。缩写_name | |“”),
      (地点、地址和组件[1]&&
      place.address_components[1]。缩写为|||“”,
      (地点、地址和组件[2]&&
      place.address_components[2]。缩写_name | |“”)
      ].加入(“”);
      
      <!DOCTYPE html>
      <html>
          <head>
              <title>Google Maps JavaScript API v3 Example: Places Autocomplete</title>
              <script src="https://maps.googleapis.com/maps/api/js?sensor=false&libraries=places"
                  type="text/javascript"></script>
      
              <style type="text/css">
                  body {
                      font-family: sans-serif;
                      font-size: 14px;
                  }
                  #map_canvas {
                      height: 400px;
                      width: 600px;
                      margin-top: 0.6em;
                  }
              </style>
      
              <script type="text/javascript">
                  var ns = {}; // a name space
                  ns.checktimes = 0; // a couter of check times
                  // the check function
                  // @param dropdown: the drop-down list of Places.AutoComplete
                  // @param msg: the div to show message
                  ns._doCheck = function (dropdown, msg) {
                      if (dropdown.style.display == '') {
                          msg.innerHTML = 'has results? true';
                          ns.checkTimer = null;
                      }
                      else if (dropdown.style.display == 'none') {
                          msg.innerHTML = 'has results? false';
                          ns.checkTimer = null;
                      } else if (ns.checktimes < 20) { // check at most 10 seconds
                          ns.checktimes++;
                          ns.checkTimer = setTimeout(function () {
                              ns._doCheck(dropdown, msg);
                          }, 500);
                      }
                  }
                  function initialize() {
                      var mapOptions = {
                          center: new google.maps.LatLng(-33.8688, 151.2195),
                          zoom: 13,
                          mapTypeId: google.maps.MapTypeId.ROADMAP
                      };
                  var map = new google.maps.Map(document.getElementById('map_canvas'),
                      mapOptions);
      
                  var input = document.getElementById('searchTextField');
                  var autocomplete = new google.maps.places.Autocomplete(input);
      
                  autocomplete.bindTo('bounds', map);
      
                  var infowindow = new google.maps.InfoWindow();
                  var marker = new google.maps.Marker({
                      map: map
                  });
      
                  google.maps.event.addListener(autocomplete, 'place_changed', function() {
                      infowindow.close();
                      var place = autocomplete.getPlace();
                  if (place.geometry.viewport) {
                      map.fitBounds(place.geometry.viewport);
                  } else {
                      map.setCenter(place.geometry.location);
                      map.setZoom(17);  // Why 17? Because it looks good.
                  }
      
                  var image = new google.maps.MarkerImage(
                      place.icon,
                      new google.maps.Size(71, 71),
                      new google.maps.Point(0, 0),
                      new google.maps.Point(17, 34),
                      new google.maps.Size(35, 35));
                  marker.setIcon(image);
                  marker.setPosition(place.geometry.location);
      
                  var address = '';
                  if (place.address_components) {
                      address = [(place.address_components[0] &&
                      place.address_components[0].short_name || ''),
                      (place.address_components[1] &&
                      place.address_components[1].short_name || ''),
                      (place.address_components[2] &&
                      place.address_components[2].short_name || '')
                      ].join(' ');
                  }
      
                  infowindow.setContent('<div><strong>' + place.name + '</strong><br>' + address);
                  infowindow.open(map, marker);
                  // update stored value
                  ns.oldValue = document.getElementById('searchTextField').value;
              });
      
              // Sets a listener on a radio button to change the filter type on Places
              // Autocomplete.
              function setupClickListener(id, types) {
                  var radioButton = document.getElementById(id);
                  google.maps.event.addDomListener(radioButton, 'click', function() {
                  autocomplete.setTypes(types);
                  });
              }
      
              setupClickListener('changetype-all', []);
              setupClickListener('changetype-establishment', ['establishment']);
              setupClickListener('changetype-geocode', ['geocode']);
              }
      
              // to check whether responsee and has results
              function startCheck () {
                  // the input node
                  var inp = document.getElementById('searchTextField'),
                      value = inp.value; // value of input node
                  if (value && ns.oldValue != value) { // has value and changed, start check
                      // drop-down list and message div
                      var dropdown = document.getElementsByClassName('pac-container')[0],
                          msg = document.getElementById('msg');
                      // trick! change style to display='block'
                      dropdown.style.display = 'block';
                      // update stored value
                      ns.oldValue = value;
                      // initiate checktimes
                      ns.checktimes = 0;
                      // clear previous timer if exists
                      if (ns.checkTimer)
                          clearTimeout (ns.checkTimer);
                      ns.checkTimer = setTimeout(function () {
                          ns._doCheck(dropdown, msg);
                      }, 500);
                  }
              }
              google.maps.event.addDomListener(window, 'load', initialize);
          </script>
          </head>
          <body>
              <div>
                  <div id="msg">has results? </div>
                  <input id="searchTextField" type="text" size="50" onkeyup="startCheck();">
                  <input type="radio" name="type" id="changetype-all" checked="checked">
                  <label for="changetype-all">All</label>
      
                  <input type="radio" name="type" id="changetype-establishment">
                  <label for="changetype-establishment">Establishments</label>
      
                  <input type="radio" name="type" id="changetype-geocode">
                  <label for="changetype-geocode">Geocodes</lable>
              </div>
              <div id="map_canvas"></div>
          </body>
      </html>
      
      const displaySuggestions = (predictions, status) => {
            if (status !== google.maps.places.PlacesServiceStatus.OK) {
              if (status === 'ZERO_RESULTS') {
                alert('zero results found')
              }
              return;
            }
          };
          // you can create autocompleteService as variable outside the function as well
          const autocompleteService = new google.maps.places.AutocompleteService();
          // input is string of what user types 
          autocompleteService.getPlacePredictions({ input: input, types: ['address'] }, displaySuggestions);
      
      const _handleChange = (event, value) => {
          setTimeout(() => {
              const dropdownList = document.getElementsByClassName('pac-container')[0];
              if (dropdownList.childElementCount === 0) {
                  // Zero results
              } else {
                  // Has results
              }
              console.log('child count:', dropdownList.childElementCount);
          }, 100);
      };