【问题标题】:Google Maps API autocomplete 2nd address fields on same pageGoogle Maps API 自动完成同一页面上的第二个地址字段
【发布时间】:2018-04-01 17:42:39
【问题描述】:

我在我的页面上使用 Google Maps API,页面要求用户填写您的“当前地址”和“新地址”。

我可以让自动完成功能在第一个地址上工作,但它不适用于第二个地址,我做了很多研究并查看了 stackoverflow 上的类似帖子,但我找不到任何遇到同样问题的人。

这是我的代码;

<div id="locationField">
    <input id="autocomplete" placeholder="Start typing your address" onFocus="geolocate()" type="text"></input>
</div>

<div id="addressone">
    <input type="text" id="street_number" name="street_number"></input>
    <input type="text" id="route" name="street_name"></input>
    <input type="text" id="locality" name="town_city"></input>
    <input type="text" id="postal_code" name="postcode"></input>
    <input type="text" id="country" name="country"></input>
</div>

<div id="locationField2">
    <input id="autocomplete2" placeholder="Start typing your address" onFocus="geolocate()" type="text"></input>
</div>

<div id="addresstwo">
    <input type="text" id="street_number2" name="street_number2"></input>
    <input type="text" id="route2" name="street_name2"></input>
    <input type="text" id="locality2" name="town_city2"></input>
    <input type="text" id="postal_code2" name="postcode2"></input>
    <input type="text" id="country2" name="country2"></input>
</div>
<script>

    // This example displays an address form, using the autocomplete feature
    // of the Google Places API to help users fill in the information.

    var placeSearch, autocomplete;
    var componentForm = {
      street_number: 'short_name',
      route: 'long_name',
      locality: 'long_name',
      administrative_area_level_1: 'short_name',
      country: 'long_name',
      postal_code: 'short_name'
    };

    function initAutocomplete() {
      // Create the autocomplete object, restricting the search to geographical
      // location types.
      autocomplete = new google.maps.places.Autocomplete(
          /** @type {!HTMLInputElement} */(document.getElementById('autocomplete')),
          {types: ['geocode']});

      // When the user selects an address from the dropdown, populate the address
      // fields in the form.
      autocomplete.addListener('place_changed', fillInAddress);

    }

    // [START region_fillform]
    function fillInAddress() {
      // Get the place details from the autocomplete object.
      var place = autocomplete.getPlace();

      for (var component in componentForm) {
        document.getElementById(component).value = '';
        document.getElementById(component).disabled = false;
      }

      // Get each component of the address from the place details
      // and fill the corresponding field on the form.
      for (var i = 0; i < place.address_components.length; i++) {
        var addressType = place.address_components[i].types[0];
        if (componentForm[addressType]) {
          var val = place.address_components[i][componentForm[addressType]];
          document.getElementById(addressType).value = val;
        }
      }
    }
    // [END region_fillform]

    // [START region_geolocation]
    // Bias the autocomplete object to the user's geographical location,
    // as supplied by the browser's 'navigator.geolocation' object.
    function geolocate() {
      if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function(position) {
          var geolocation = {
            lat: position.coords.latitude,
            lng: position.coords.longitude
          };
          var circle = new google.maps.Circle({
            center: geolocation,
            radius: position.coords.accuracy
          });
          autocomplete.setBounds(circle.getBounds());
        });
      }
    }
    // [END region_geolocation]

</script>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyC7XIOPnu4WS_fBaIDPkCBdYa3MxdIcdK4&signed_in=true&libraries=places&callback=initAutocomplete" async defer></script>
</div>

【问题讨论】:

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


    【解决方案1】:

    这行得通,使用 jQuery。

    function initMultiComplete() {
       jQuery('.maps-complete').each(function(){
        
        var id = jQuery(this).prop('id');
        var $this = jQuery(this);
        var parent = jQuery(this).parent('div');
        
        var jautocomplete = new google.maps.places.Autocomplete(document.getElementById(id), {types: ['geocode']});
        
        jautocomplete.addListener('place_changed', function ()    {
        
            var place = jautocomplete.getPlace();
            var address = $this.val();
            var lat = place.geometry.location.lat();
            var lng = place.geometry.location.lng();
    
            jQuery( '.maps-autocomplete-lat', parent ).val(lat);
            jQuery( '.maps-autocomplete-lng', parent ).val(lng);
                
        });
        
    });
    }
    

    脚本调用 initMultiComplete 作为回调,并通过异步延迟加载:

    https://maps.googleapis.com/maps/api/js?key=YOUR_KEY&libraries=places&callback=initMultiComplete
    

    【讨论】:

      【解决方案2】:

      您需要处理两个自动完成输入。这是fillInAddress 的通用版本,它将处理具有唯一扩展名(表单的第二个版本中的“2”)字段的多个自动完成对象:

      function fillInAddress(autocomplete, unique) {
          // Get the place details from the autocomplete object.
          var place = autocomplete.getPlace();
      
          for (var component in componentForm) {
              if(!!document.getElementById(component + unique)){
                  document.getElementById(component + unique).value = '';
                  document.getElementById(component + unique).disabled = false;
              }
          }
      
          // Get each component of the address from the place details
          // and fill the corresponding field on the form.
          for (var i = 0; i < place.address_components.length; i++) {
              var addressType = place.address_components[i].types[0];
              if (componentForm[addressType] && document.getElementById(addressType + unique)) {
                  var val = place.address_components[i][componentForm[addressType]];
                  document.getElementById(addressType + unique).value = val;
              }
          }
      }
      

      这样称呼它:

      // Create the autocomplete object, restricting the search to geographical
      // location types.
      autocomplete = new google.maps.places.Autocomplete(
      /** @type {!HTMLInputElement} */
      (document.getElementById('autocomplete')), {
          types: ['geocode']
      });
      
      // When the user selects an address from the dropdown, populate the address
      // fields in the form.
      autocomplete.addListener('place_changed', function () {
          fillInAddress(autocomplete, "");
      });
      
      // Create the second autocomplete object, restricting the search to geographical
      // location types.
      autocomplete2 = new google.maps.places.Autocomplete(
      /** @type {!HTMLInputElement} */
      (document.getElementById('autocomplete2')), {
          types: ['geocode']
      });
      autocomplete2.addListener('place_changed', function () {
          fillInAddress(autocomplete2, "2");
      });
      

      工作代码 sn-p:

      // This example displays an address form, using the autocomplete feature
      // of the Google Places API to help users fill in the information.
      
      var placeSearch, autocomplete, autocomplete2;
      var componentForm = {
        street_number: 'short_name',
        route: 'long_name',
        locality: 'long_name',
        administrative_area_level_1: 'short_name',
        country: 'long_name',
        postal_code: 'short_name'
      };
      
      function initAutocomplete() {
        // Create the autocomplete object, restricting the search to geographical
        // location types.
        autocomplete = new google.maps.places.Autocomplete(
          /** @type {!HTMLInputElement} */
          (document.getElementById('autocomplete')), {
            types: ['geocode']
          });
      
        // When the user selects an address from the dropdown, populate the address
        // fields in the form.
        autocomplete.addListener('place_changed', function() {
          fillInAddress(autocomplete, "");
        });
      
        autocomplete2 = new google.maps.places.Autocomplete(
          /** @type {!HTMLInputElement} */
          (document.getElementById('autocomplete2')), {
            types: ['geocode']
          });
        autocomplete2.addListener('place_changed', function() {
          fillInAddress(autocomplete2, "2");
        });
      
      }
      
      function fillInAddress(autocomplete, unique) {
        // Get the place details from the autocomplete object.
        var place = autocomplete.getPlace();
      
        for (var component in componentForm) {
          if (!!document.getElementById(component + unique)) {
            document.getElementById(component + unique).value = '';
            document.getElementById(component + unique).disabled = false;
          }
        }
      
        // Get each component of the address from the place details
        // and fill the corresponding field on the form.
        for (var i = 0; i < place.address_components.length; i++) {
          var addressType = place.address_components[i].types[0];
          if (componentForm[addressType] && document.getElementById(addressType + unique)) {
            var val = place.address_components[i][componentForm[addressType]];
            document.getElementById(addressType + unique).value = val;
          }
        }
      }
      google.maps.event.addDomListener(window, "load", initAutocomplete);
      
      function geolocate() {
        if (navigator.geolocation) {
          navigator.geolocation.getCurrentPosition(function(position) {
            var geolocation = {
              lat: position.coords.latitude,
              lng: position.coords.longitude
            };
            var circle = new google.maps.Circle({
              center: geolocation,
              radius: position.coords.accuracy
            });
            autocomplete.setBounds(circle.getBounds());
          });
        }
      }
      <script src="https://maps.googleapis.com/maps/api/js?libraries=places&key=AIzaSyCkUOdZ5y7hMm0yrcCQoCvLwzdM6M8s5qk"></script>
      <div id="locationField">
        <input id="autocomplete" placeholder="Start typing your address" onFocus="geolocate()" type="text" />
      </div>
      <div id="addressone">
        <input type="text" id="street_number" name="street_number" />
        <input type="text" id="route" name="street_name" />
        <input type="text" id="locality" name="town_city" />
        <input type="text" id="administrative_area_level_1" name="administrative_area_level_1" />
        <input type="text" id="postal_code" name="postcode" />
        <input type="text" id="country" name="country" />
      </div>
      <div id="locationField2">
        <input id="autocomplete2" placeholder="Start typing your address" onFocus="geolocate()" type="text" />
      </div>
      <div id="addresstwo">
        <input type="text" id="street_number2" name="street_number2" />
        <input type="text" id="route2" name="street_name2" />
        <input type="text" id="locality2" name="town_city2" />
        <input type="text" id="administrative_area_level_12" name="administrative_area_level_12" />
        <input type="text" id="postal_code2" name="postcode2" />
        <input type="text" id="country2" name="country2" />
      </div>

      【讨论】:

        【解决方案3】:

        这是一个老问题,但我想我会发布我的解决方案,以防将来对其他人有帮助。我的解决方案处理页面上任意数量的地图 api 自动完成字段。您需要使用类名标记所有自动完成字段,在我的情况下,我使用了类名“地址”。

        现在获取字段集合:

        var input = document.getElementsByClassName('address');
        
        for (var x = 0; x < input.length; x++) {
                addListener(input[x]);
            }
        

        调用一个名为“addListener”的函数

        function addListener(el) {
          var autocomplete = new google.maps.places.Autocomplete(el);
        
          google.maps.event.addListener(autocomplete, 'place_changed', function ()    {
         // Do whatever you want in here e.g.
         // var place = autocomplete.getPlace();
          });
        }
        

        因为它是一个集合,所以您应该能够向页面添加任意数量的自动完成字段。当然,您应该检查集合上的 undefined 以防万一您碰巧在页面上没有自动完成字段。

        【讨论】:

          猜你喜欢
          • 2012-08-09
          • 2023-03-12
          • 1970-01-01
          • 2015-08-26
          • 2021-04-19
          • 2012-03-15
          • 1970-01-01
          相关资源
          最近更新 更多