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

如何移除Google Maps自动补全下拉框中的部分邮政编码?

如何移除Google Maps自动补全中的部分邮政编码选项

针对英国地区只保留完整邮政编码的需求,提供两种可行解决方案:

方案一:直接绑定自动补全到邮编输入框(推荐)

这是最简单稳定的实现方式,通过将Autocomplete实例绑定到邮编输入框,并指定返回类型为邮编,从根源上避免部分邮编选项出现。

修改后的代码如下:

let autocomplete;
let address1Field;
let postalField;

function initAutocomplete() {
  address1Field = document.querySelector("#ship-address");
  postalField = document.querySelector("#postcode");

  // 将自动补全绑定到邮编输入框,限制仅返回邮编类型结果
  autocomplete = new google.maps.places.Autocomplete(postalField, {
    componentRestrictions: { country: ["gb"] },
    types: ["postal_code"],
    fields: ["address_components", "geometry"],
  });
  postalField.focus();

  autocomplete.addListener("place_changed", fillInAddress);
}

function fillInAddress() {
  const place = autocomplete.getPlace();
  let address1 = "";
  let postcode = "";

  for (const component of place.address_components) {
    const componentType = component.types[0];
    switch (componentType) {
      case "street_number":
        address1 = `${component.long_name} ${address1}`;
        break;
      case "route":
        address1 += component.short_name;
        break;
      case "sublocality_level_1":
        address1 += component.long_name;
        break;
      case "postal_code":
        postcode = `${component.long_name}${postcode}`;
        break;
      case "postal_code_suffix":
        postcode = `${postcode}-${component.long_name}`;
        break;
      case "postal_town":
        document.querySelector("#postal_town").value = component.long_name;
        break;
      case "administrative_area_level_2":
        document.querySelector("#county").value = component.long_name;
        break;
    }
  }

  address1Field.value = address1;
  postalField.value = postcode;

  document.getElementById('details').innerHTML = `<input name="latitude" type="hidden" id="latitude" value="${place.geometry.location.lat()}"><input name="longitude" type="hidden" id="longitude" value="${place.geometry.location.lng()}">`;
}

window.initAutocomplete = initAutocomplete;

关键改动:

  • 将Autocomplete绑定到邮编输入框postalField
  • 添加types: ["postal_code"]参数,强制API仅返回完整邮政编码结果

方案二:过滤地址输入框的部分邮编选项

若必须保留地址输入框的自动补全功能,可通过自定义预测结果过滤,移除仅显示部分邮编的选项。

实现代码如下:

let autocompleteService;
let address1Field;
let postalField;
let dropdown;

function initAutocomplete() {
  address1Field = document.querySelector("#ship-address");
  postalField = document.querySelector("#postcode");
  
  // 创建自定义下拉容器
  dropdown = document.createElement("div");
  dropdown.className = "autocomplete-dropdown";
  address1Field.parentNode.appendChild(dropdown);

  autocompleteService = new google.maps.places.AutocompleteService();
  
  // 监听输入事件,获取并过滤预测结果
  address1Field.addEventListener("input", function() {
    const query = this.value;
    if (!query) {
      dropdown.innerHTML = "";
      return;
    }

    autocompleteService.getPlacePredictions({
      input: query,
      componentRestrictions: { country: ["gb"] },
      types: ["address"]
    }, function(predictions, status) {
      if (status !== google.maps.places.PlacesServiceStatus.OK) {
        dropdown.innerHTML = "";
        return;
      }

      // 过滤仅包含部分邮编的结果(匹配英国完整邮编格式)
      const filteredPredictions = predictions.filter(prediction => {
        const fullPostcodeRegex = /[A-Z]{1,2}[0-9][A-Z0-9]? [0-9][A-Z]{2}/i;
        return !prediction.description.match(/\b[A-Z0-9]{1,4}\b$/i) || prediction.description.match(fullPostcodeRegex);
      });

      // 渲染过滤后的选项
      dropdown.innerHTML = filteredPredictions.map(prediction => `
        <div class="autocomplete-option" data-place-id="${prediction.place_id}">${prediction.description}</div>
      `).join("");

      // 绑定选项点击事件
      dropdown.querySelectorAll(".autocomplete-option").forEach(option => {
        option.addEventListener("click", function() {
          const placeId = this.dataset.placeId;
          const placesService = new google.maps.places.PlacesService(document.createElement("div"));
          placesService.getDetails({
            placeId: placeId,
            fields: ["address_components", "geometry"]
          }, function(place, status) {
            if (status === google.maps.places.PlacesServiceStatus.OK) {
              fillInAddress(place);
            }
            dropdown.innerHTML = "";
          });
        });
      });
    });
  });

  // 点击页面其他区域关闭下拉框
  document.addEventListener("click", function(e) {
    if (!address1Field.contains(e.target) && !dropdown.contains(e.target)) {
      dropdown.innerHTML = "";
    }
  });
}

function fillInAddress(place) {
  let address1 = "";
  let postcode = "";

  for (const component of place.address_components) {
    const componentType = component.types[0];
    switch (componentType) {
      case "street_number":
        address1 = `${component.long_name} ${address1}`;
        break;
      case "route":
        address1 += component.short_name;
        break;
      case "sublocality_level_1":
        address1 += component.long_name;
        break;
      case "postal_code":
        postcode = `${component.long_name}${postcode}`;
        break;
      case "postal_code_suffix":
        postcode = `${postcode}-${component.long_name}`;
        break;
      case "postal_town":
        document.querySelector("#postal_town").value = component.long_name;
        break;
      case "administrative_area_level_2":
        document.querySelector("#county").value = component.long_name;
        break;
    }
  }

  address1Field.value = address1;
  postalField.value = postcode;

  document.getElementById('details').innerHTML = `<input name="latitude" type="hidden" id="latitude" value="${place.geometry.location.lat()}"><input name="longitude" type="hidden" id="longitude" value="${place.geometry.location.lng()}">`;
}

window.initAutocomplete = initAutocomplete;

配套基础样式(可选):

.autocomplete-dropdown {
  position: absolute;
  background: white;
  border: 1px solid #ccc;
  max-height: 200px;
  overflow-y: auto;
  z-index: 1000;
}
.autocomplete-option {
  padding: 8px 12px;
  cursor: pointer;
}
.autocomplete-option:hover {
  background: #f0f0f0;
}

方案对比

优先选择方案一,它利用Google API原生参数限制结果类型,实现简单、维护成本低,且稳定性更高;方案二需自定义渲染下拉框,适合必须保留地址输入框自动补全的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:16:17