Google Maps API自动填充同一页面上的第二个地址栏 [英] Google Maps API autocomplete 2nd address fields on same page

查看:78
本文介绍了Google Maps API自动填充同一页面上的第二个地址栏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

我可以让自动完成工作在第一个地址,但它不适用于第二个地址,我已经做了大量的研究,并在stackoverflow上查看simular帖子,但我找不到任何人有同样的问题。



以下是我的代码;

 < div id =locationField> 
< input id =autocompleteplaceholder =开始输入您的地址onFocus =geolocate()type =text>< / input>
< / div>

< div id =addressone>
< input type =textid =street_numbername =street_number>< / input>
< input type =textid =routename =street_name>< / input>
< input type =textid =localityname =town_city>< / input>
< input type =textid =postal_codename =postcode>< / input>
< input type =textid =countryname =country>< / input>
< / div>

< div id =locationField2>
< input id =autocomplete2placeholder =开始输入您的地址onFocus =geolocate()type =text>< / input>
< / div>

< div id =addresstwo>
< input type =textid =street_number2name =street_number2>< / input>
< input type =textid =route2name =street_name2>< / input>
< input type =textid =locality2name =town_city2>< / input>
< input type =textid =postal_code2name =postcode2>< / input>
< input type =textid =country2name =country2>< / input>
< / div>
< script>

//此示例使用Google Places API的自动填充功能
//来显示地址表单,以帮助用户填写信息。

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

函数initAutocomplete(){
//创建自动填充对象,将搜索限制为地理区域
//位置类型。
autocomplete = new google.maps.places.Autocomplete(
/ ** @type {!HTMLInputElement} * /(document.getElementById('autocomplete')),
{types:['地理编码']});

//当用户从下拉列表中选择一个地址时,填写表单中的地址
//字段。
autocomplete.addListener('place_changed',fillInAddress);

}

// [START region_fillform]
函数fillInAddress(){
//从自动填充对象获取地点详细信息。
var place = autocomplete.getPlace();

(componentForm中的var组件){
document.getElementById(component).value ='';
document.getElementById(component).disabled = false;
}

//从地点详细信息
//获取地址的每个组成部分,然后填写表单上相应的字段。
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]
//将自动填充对象偏移到用户的地理位置
//由浏览器的navigator.geolocation对象提供。
函数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=initAutocompleteasync defer>< / script>
< / div>


解决方案

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

 函数fillInAddress(自动完成,唯一){
//从自动完成对象中获取地点详细信息。
var place = autocomplete.getPlace();

(componentForm中的var组件){
if(!! document.getElementById(component + unique)){
document.getElementById(component + unique).value =' ;
document.getElementById(component + unique).disabled = false;
}
}

//从地点详细信息
//获取地址的每个组成部分,然后填写表单中相应的字段。
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;





$ b

像这样调用它:


$ b $ / p>

  //创建自动填充对象,将搜索限制为地理区域
//位置类型。
autocomplete = new google.maps.places.Autocomplete(
/ ** @type {!HTMLInputElement} * /
(document.getElementById('autocomplete')),{
类型:['geocode']
});

//当用户从下拉列表中选择一个地址时,填写表单中的地址
//字段。
autocomplete.addListener('place_changed',function(){
fillInAddress(autocomplete,);
});

//创建第二个自动填充对象,将搜索限制为地理
//位置类型。
autocomplete2 = new google.maps.places.Autocomplete(
/ ** @type {!HTMLInputElement} * /
(document.getElementById('autocomplete2')),{
类型:['geocode']
});
autocomplete2.addListener('place_changed',function(){
fillInAddress(autocomplete2,2);
});

工作程式码片段:

  //此示例使用Google Places API的自动完成功能//帮助用户填写information.var placeSearch,autocomplete,autocomplete2; var componentForm = {我们可以创建自动完成的对象,限制自动完成的对象,或者创建一个自动完成的对象。搜索地理位置类型。 autocomplete = new google.maps.places.Autocomplete(/ ** @type {!HTMLInputElement} * /(document.getElementById('autocomplete')),{types:['geocode']}); //当用户从下拉列表中选择一个地址时,填写表单中的地址字段。 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);});}函数fillInAddress(autocomplete,unique){//从自动填充对象获取地点详细信息。 var place = autocomplete.getPlace();对于(componentForm中的var组件){if(!! document.getElementById(component + unique)){document.getElementById(component + unique).value =''; document.getElementById(component + unique).disabled = false; }} //从地点详细信息中获取地址的每个组成部分//并填充表单上的相应字段。 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\"></script><div id =locationField> < input id =autocompleteplaceholder =开始输入您的地址onFocus =geolocate()type =text/>< / div>< div id =addressone> < input type =textid =street_numbername =street_number/> < input type =textid =routename =street_name/> < input type =textid =localityname =town_city/> < input type =textid =administrative_area_level_1name =administrative_area_level_1/> < input type =textid =postal_codename =postcode/> < input type =textid =countryname =country/>< / div>< div id =locationField2> < input id =autocomplete2placeholder =开始输入您的地址onFocus =geolocate()type =text/>< / div>< div id =addresstwo> < input type =textid =street_number2name =street_number2/> < input type =textid =route2name =street_name2/> < input type =textid =locality2name =town_city2/> < input type =textid =administrative_area_level_12name =administrative_area_level_12/> < input type =textid =postal_code2name =postcode2/> < input type =textid =country2name =country2/>< / div>

p>

I am using the Google Maps API on my page, the page asks the user to fill out your "Current Address" and the "New Address".

I can get the autocomplete to work on the 1st address but it does not work for the second address, I have done lots of research and looked at simular posts on stackoverflow but I cannot find anyone who has had the same problem.

Here is my code;

<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>

解决方案

You need to hande the two autocomplete inputs. Here is a generalized version of fillInAddress that will handle multiple autocomplete objects with fields with a unique extension (the "2" in your second version of the form):

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;
        }
    }
}

Call it like this:

// 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");
});

working code snippet:

// 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"></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>

这篇关于Google Maps API自动填充同一页面上的第二个地址栏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆