You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Places Autocomplete限制带门牌号地址及仅允许选中建议提交实现问询

Google Maps Places API地址自动补全功能改造实现

功能1:限制返回地址建议必须包含街道门牌号

修改Autocomplete初始化的types参数即可,Google Places API的street_address类型专门指代包含完整门牌号的街道级地址,不会返回仅包含街道名、城市名的粗粒度结果。
将原配置中types: ["address"]直接替换为types: ["street_address"]即可满足要求。

功能2:限制仅选中自动补全建议才可提交表单

通过状态标记+表单拦截逻辑实现:

  • 新增全局变量标记用户是否选中了官方建议的地址
  • 监听地址输入框的手动输入事件,只要用户手动修改内容就将标记置为未选中状态
  • 选中自动补全建议触发place_changed回调时,将标记置为已选中状态
  • 绑定表单的submit事件,提交前校验标记状态,未选中则阻止提交并提示错误

完整修改后可运行代码

<!DOCTYPE html>
<html>
<body>

<form id="addressForm">
   <input id="customerAddress" name="customerAddress" required autocomplete="off" />
   <input id="zip" name="zip" required readonly />
   <input id="city" name="city" required readonly />
   <button type="submit">提交</button>
</form>
<div id="errorTip" style="color: red; display: none;">请从自动补全列表中选择有效地址</div>

    <script
      src="https://maps.googleapis.com/maps/api/js?key=MY_API_KEY&callback=initAutocomplete&libraries=places"
      async
    ></script>
    
    <script>
        let autocomplete;
        // 新增:地址选中状态标记
        let isPlaceSelected = false;
        const errorTip = document.querySelector("#errorTip");
        const addressForm = document.querySelector("#addressForm");
        const customerAddressInput = document.querySelector("#customerAddress");
        
        function initAutocomplete() {
         
          autocomplete = new google.maps.places.Autocomplete(customerAddressInput, {
            componentRestrictions: { country: ["de", "DE"] },
            fields: ["address_components", "geometry"],
            // 功能1修改:替换address为street_address,仅返回带门牌号的地址
            types: ["street_address"],
          });
          autocomplete.addListener("place_changed", fillInAddress);

          // 新增:监听用户手动输入事件
          customerAddressInput.addEventListener('input', () => {
            isPlaceSelected = false;
            errorTip.style.display = 'none';
          })

          // 新增:表单提交拦截校验
          addressForm.addEventListener('submit', (e) => {
            if(!isPlaceSelected) {
              e.preventDefault();
              errorTip.style.display = 'block';
            }
          })
        }
        
        function fillInAddress() {
          
          const place = autocomplete.getPlace();
          // 兼容异常情况:如果选中的地址没有返回地址组件,视为无效
          if (!place.address_components) {
            isPlaceSelected = false;
            errorTip.style.display = 'block';
            return;
          }
          // 选中有效地址,更新标记
          isPlaceSelected = true;
          errorTip.style.display = 'none';

          var address = ""
          var streetNumber = ""
        
          
          for (const component of place.address_components) {
            const componentType = component.types[0];
            
            switch (componentType) {

              case "route": {
                address = component.long_name;
                break;
              }
              
              case "street_number": {
                  streetNumber = component.long_name
                  break;
                }
        
              case "postal_code": {
                document.querySelector("#zip").value = component.long_name;
                break;
              }
        

              case "locality":
                document.querySelector("#city").value = component.long_name;
                break;

            }
          }
        
        customerAddressInput.value = address +" "+streetNumber
                  
          
        }
    </script>
  </body>
</html>

内容的提问来源于stack exchange,提问作者Trombone0904

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:24:01