【问题标题】:google map autocomplete address click谷歌地图自动完成地址点击
【发布时间】:2013-03-23 15:56:43
【问题描述】:

我有一个谷歌地图和他们的一个自动完成文本框,用户开始输入,地址显示在下拉列表中,然后地图缩放到最终选择的那个。到目前为止,我对自己所拥有的感到非常满意;问题是,用户必须单击列表中的地址才能使其工作。

我想要的也是这个选项:当用户在键盘上点击'ENTER'时,即使他们没有完全填写auto_complete框,也会自动选择列表中的第一个地址,并且地图会缩放到那个。

我在玩

$(autocomplete).trigger("click");

但我无法修复它。所以,如果你能帮我一把,我将不胜感激......我的代码是:

<script type="text/javascript">
  function initialize_google_maps() {



    var midOfIreland = new google.maps.LatLng(53.252069, -7.860718);
    var myOptions = {
      zoom: 7,
      center: midOfIreland,
      mapTypeId: google.maps.MapTypeId.ROADMAP, // ROADMAP, SATELLITE, HYBRID
      streetViewControl: false
    };
    var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

    var input = document.getElementById('address_autocomplete');
    var options = {
      types: ['geocode']
    };

   autocomplete = new google.maps.places.Autocomplete(input, options);
    autocomplete.bindTo('bounds', map);
    // $(autocomplete).trigger("click");

    var contentstring = $('#info_window').html();


var infowindow = new google.maps.InfoWindow({content: contentstring, width:1, height:1});
// for the 'x', to close the infoWindow, we give it the same behaviour as the 'No' link, in the infoWindow
google.maps.event.addListener(infowindow, 'closeclick', function() {   
  $(".map-no-link").trigger("click");
});  


   var marker = new google.maps.Marker({
      map: map
    });



    google.maps.event.addListener(autocomplete, 'place_changed', function() {
      var place = autocomplete.getPlace();
      if (place.geometry.viewport) {
          map.fitBounds(place.geometry.viewport);
      } else {
          map.setCenter(place.geometry.location);
          map.setZoom(11);
      }
      marker.setPosition(place.geometry.location);
      $('#user_lat').val(place.geometry.location.lat());
      $('#user_lng').val(place.geometry.location.lng());
      $('#changed').val('1');

   //   infowindow.setContent(place.name);
      infowindow.open(map, marker);
    });

    <% if current_user.address and current_user.lat %>
      var currentlatlng = new google.maps.LatLng(<%= current_user.lat %>, <%= current_user.lng %>);
      var marker = new google.maps.Marker({map: map, position: currentlatlng});
      map.setCenter(currentlatlng);
      map.setZoom(11);
    <% end %>

  }

  $(function() {
      initialize_google_maps();
  });

</script>

【问题讨论】:

    标签: google-maps autocomplete


    【解决方案1】:

    检查此jsFiddle。您需要做的是在按下 Enter 时进行监听,从自动完成容器中取出第一项,对其进行地理编码并处理结果。

    $(document).keypress(function (e) {
      if (e.which == 13) {
        var firstResult = $(".pac-container .pac-item:first").text();
        var geocoder = new google.maps.Geocoder();
          geocoder.geocode({"address":firstResult }, function(results, status) {
          if (status == google.maps.GeocoderStatus.OK) {
            var lat = results[0].geometry.location.lat(),
                lng = results[0].geometry.location.lng(),
                placeName = results[0].address_components[0].long_name,
                latlng = new google.maps.LatLng(lat, lng);
    
            moveMarker(placeName, latlng);
            $("input").val(firstResult);
          }
        });
      }
    });
    

    【讨论】:

    • 您好,Pohoda 先生,谢谢您,但无法正常工作。我将您的代码添加到脚本的底部。在控制台(Chrome)中,我收到错误:Uncaught TypeError: Cannot read property 'viewport' of undefined。还有其他想法吗?好像错误不在您提供的代码中,但是当我将其取出时,我已经存在的代码中没有错误。
    • 如果上面的例子对你有用,那么你的代码肯定有问题。您是否包含 Places 库?将您的代码发布到 jsFiddle,以便我们查看。
    • 您好,感谢您的帮助,但我的 html 和 javascript 都与 ruby​​ on rails 相关联。不知道如何将它们分开...无论如何,我已经粘贴了我认为是 jsfiddle 上的相关代码...感谢您的帮助:jsfiddle.net/Christophe1/GpkYY
    • 实际上,我刚刚在 jsfiddle 中添加了一些代码,但我忽略了,因此您可能需要刷新。
    • 您正在将 html 与模板以及 javascript 与无法工作的模板混合(至少在 jsFiddle 上)。也许您在项目中遇到了同样的问题 - 查看生成的 html 和 javascript 并将其与我的示例进行比较。如果我的回答对您有用,请考虑将其标记为解决方案。
    【解决方案2】:

    这是我最终使用的代码,它有效:

    <script type="text/javascript">
      var pac_input = document.getElementById('address_autocomplete');
    
      (function pacSelectFirst(input){
        // store the original event binding function
        var _addEventListener = (input.addEventListener) ? input.addEventListener : input.attachEvent;
    
        function addEventListenerWrapper(type, listener) {
          // Simulate a 'down arrow' keypress on hitting 'return' when no pac suggestion is selected,
          // and then trigger the original listener.
          if (type == "keydown") {
            var orig_listener = listener;
            listener = function (event) {
              var suggestion_selected = $(".pac-item.pac-selected").length > 0;
              if (event.which == 13 && !suggestion_selected) {
                event.preventDefault();
                var simulated_downarrow = $.Event("keydown", {keyCode:40, which:40})
                orig_listener.apply(input, [simulated_downarrow]);
              }
    
              orig_listener.apply(input, [event]);
            };
          }
    
          // add the modified listener
          _addEventListener.apply(input, [type, listener]);
        }
    
        if (input.addEventListener)
          input.addEventListener = addEventListenerWrapper;
        else if (input.attachEvent)
          input.attachEvent = addEventListenerWrapper;
    
      })(pac_input);
    
      function initialize_google_maps() {
        var midOfIreland = new google.maps.LatLng(53.252069, -7.860718);
        var myOptions = {
          zoom: 7,
          center: midOfIreland,
          mapTypeId: google.maps.MapTypeId.ROADMAP, // ROADMAP, SATELLITE, HYBRID
          streetViewControl: false
        };
        var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    
        var options = {
          types: ['geocode']
        };
    
        autocomplete = new google.maps.places.Autocomplete(pac_input, options);
        autocomplete.bindTo('bounds', map);
        // $(autocomplete).trigger("click");
    
        var contentstring = $('#info_window').html();
    
        var infowindow = new google.maps.InfoWindow({content: contentstring, width:1, height:1});
        // for the 'x', to close the infoWindow, we give it the same behaviour as the 'No' link, in the infoWindow
        google.maps.event.addListener(infowindow, 'closeclick', function() {   
          $(".map-no-link").trigger("click");
        });  
    
        var marker = new google.maps.Marker({
          map: map
        });
    
        google.maps.event.addListener(autocomplete, 'place_changed', function() {
          var place = autocomplete.getPlace();
          if (place.geometry.viewport) {
              map.fitBounds(place.geometry.viewport);
          } else {
              map.setCenter(place.geometry.location);
              map.setZoom(11);
          }
    
          marker.setPosition(place.geometry.location);
          $('#user_lat').val(place.geometry.location.lat());
          $('#user_lng').val(place.geometry.location.lng());
          $('#changed').val('1');
    
          //infowindow.setContent(place.name);
          infowindow.open(map, marker);
        });
    
        <% if current_user.address and current_user.lat %>
          var currentlatlng = new google.maps.LatLng(<%= current_user.lat %>, <%= current_user.lng %>);
          var marker = new google.maps.Marker({map: map, position: currentlatlng});
          map.setCenter(currentlatlng);
          map.setZoom(11);
        <% end %>
    
      }
    
      $(function() {
          initialize_google_maps();
      });
    </script>
    

    【讨论】:

      猜你喜欢
      • 2017-09-16
      • 2014-11-18
      • 1970-01-01
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 2023-03-22
      • 2015-03-22
      相关资源
      最近更新 更多