javascript - Google Place Autocomplete Address Form 结合了 street_number 和 route 字段

标签 javascript google-maps

我正在使用 Google Javascript API 自动完成功能在当前创建的 Web 应用程序上设置地址验证系统。该系统运行良好。您开始键入地址,然后单击完整地址,字段就完成了。完成该字段后,它们将显示在 中,每个地址的每个部分都有一个唯一标识符。

目前,内部版本号显示在地址的单独字段中(即建筑物编号:101 道路名称:Test Avenue)。我想更改此设置,以便合并建筑物编号和道路名称(即地址:101 Test Avenue)。

这是填充输入字段的代码

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

street_number 是楼号,route 是路名。

我已经尝试按照下面的方式进行组合,但它输出“未定义”。请有人帮忙。

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

Fiddle with the undefined issue

最佳答案

一种选择是更改填写表单的代码以捕获要合并的两部分数据,然后将它们合并到表单中所需的字段中。

proof of concept fiddle

结合了 street_number 和 route 字段的代码片段:

// 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.
    var fullAddress = [];
    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;
      }
      if (addressType == "street_number") {
        fullAddress[0] = val;
      } else if (addressType == "route") {
        fullAddress[1] = val;
      }
    }
    document.getElementById('fullAddr').value = fullAddress.join(" ");
    if (document.getElementById('fullAddr').value !== "") {
      document.getElementById('fullAddr').disabled = false;
    }
  }
  // [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]
google.maps.event.addDomListener(window, 'load', initAutocomplete)
#locationField,
#controls {
  position: relative;
  width: 480px;
}
#autocomplete {
  position: absolute;
  top: 0px;
  left: 0px;
  width: 99%;
}
.label {
  text-align: right;
  font-weight: bold;
  width: 150px;
  color: #303030;
}
#address {
  border: 1px solid #000090;
  background-color: #f0f0ff;
  width: 480px;
  padding-right: 2px;
}
#address td {
  font-size: 10pt;
}
.field {
  width: 99%;
}
.slimField {
  width: 80px;
}
.wideField {
  width: 200px;
}
.doubleField {
  width: 400px;
}
#locationField {
  height: 20px;
  margin-bottom: 2px;
}
<script src="https://maps.googleapis.com/maps/api/js?libraries=places"></script>
<div id="locationField">
  <input id="autocomplete" placeholder="Enter your address" onFocus="geolocate()" type="text" />
</div>

<table id="address">
  <tr>
    <td class="label">Street address</td>
    <td class="slimField">
      <input class="field" id="street_number" disabled="true" />
    </td>
    <td class="wideField" colspan="2">
      <input class="field" id="route" disabled="true" />
    </td>
  </tr>
  <tr>
    <td class="label">Full Street address</td>
    <td class="doubleField" colspan="3" disabled="true">
      <input class="field" id="fullAddr" disabled="true" />
    </td>
  </tr>
  <tr>
    <td class="label">City</td>
    <td class="wideField" colspan="3">
      <input class="field" id="locality" disabled="true" />
    </td>
  </tr>
  <tr>
    <td class="label">State</td>
    <td class="slimField">
      <input class="field" id="administrative_area_level_1" disabled="true" />
    </td>
    <td class="label">Zip code</td>
    <td class="wideField">
      <input class="field" id="postal_code" disabled="true" />
    </td>
  </tr>
  <tr>
    <td class="label">Country</td>
    <td class="wideField" colspan="3">
      <input class="field" id="country" disabled="true" />
    </td>
  </tr>
</table>

关于javascript - Google Place Autocomplete Address Form 结合了 street_number 和 route 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34099010/

相关文章:

javascript - 脚本5007 : Expected object in IE9 on Canvas HTML5

javascript - 使用Jquery在右键单击时停止垂直滚动

javascript - 背景位置的百分比值;如何改变它的行为?

iphone - iPhone 上的自定义光栅/矢量 map

Javascript:非空字符串的 "truthy"值

Windows 上的 JavaScript HTA 开发。我可以使用套接字吗?

internet-explorer - Internet Explorer 中的 Google map 折线速度

javascript - 谷歌地图无法读取未定义的属性 'maps'

java - 我如何找到两个地点之间旅行的距离和时间?

android - 如何在 Android Studio 中使用 onMarkerClick 打开一个新 Activity