Ich versuche, ein Autocomplete-Textfeld zu erstellen, das nur die Postleitzahl enthalten sollte. Hier ist die Dokumentation, der ich gefolgt bin: https://developers.google.com/places/webservice/autocomplete#place_types
JSFiddle-Arbeitsbeispiel ist hier
Wenn ich den postal_code
verwende, funktioniert es nicht für mich, aber wenn ich die cities
verwende, ist es in Ordnung. Was muss ich tun, um eine Autovervollständigung nur mit Postleitzahlen zu erreichen?
function postal_code() {
var input = document.getElementById('field-postal');
var options = {
types: ['(postal_code)'],
componentRestrictions: {
country: "in"
}
}
var autocomplete = new google.maps.places.Autocomplete(input, options);
}
google.maps.event.addDomListener(window, 'load', postal_code);
Die Dokumentation ist nicht sehr klar.
- die Typensammlung (Regions) weist den Places-Dienst an, Ergebnisse zurückzugeben, die den folgenden Typen entsprechen:
- lokalität
- sublokalität
- postleitzahl
- land
- administrative_area_level_1
- administrative_area_level_2
'(postal_code)'
funktioniert nicht (das ist falsch).'postal_code'
funktioniert auch nicht.'(regions)'
arbeitet und enthält Ergebnisse vom Typ postal_codeIch habe postal_code Adresskomponententyp verwendet.
Stellen Sie sicher, dass Sie die Bibliothek places in Ihre Skript-URL aufgenommen haben:
<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCBbt5ueucPc0u9VQDb8wFvFigV90PpTQA&libraries=places&callback=initEditClntInfoAutoComplete" async defer> </script>
Arbeitsbeispiel
https://developers.google.com/maps/documentation/javascript/examples/places-autocomplete
////////// TEIL AUS MEINEM ARBEITSCODE
////////// Ersetzen Sie getByElementId durch Ihre Formulareingabe-IDs
//// Global Vars
var editClntInfoAutocomplete, addrStreet ="",
addressComponets = {
street_number: 'short_name',
route: 'long_name',
locality: 'long_name',
administrative_area_level_1: 'short_name',
country: 'long_name',
postal_code: 'short_name'
};
function initEditClntInfoAutoComplete() { // Callback
editClntInfoAutocomplete = new google.maps.places.Autocomplete(
/** @type {!HTMLInputElement} */(document.getElementById('clntInfoEditAddr1')),
{types: ['geocode']});
// When the user selects an address from the dropdown, populate the address
// fields in the form.
editClntInfoAutocomplete.addListener('place_changed', fillInEditClntInfoAddress);
}
function fillInEditClntInfoAddress() {
var place = editClntInfoAutocomplete.getPlace();
clearPrevEditFrmAddrVals();
for ( var i = 0; i < place.address_components.length; i++) {
var addressType = place.address_components[i].types[0];
if ( addressComponets[addressType] ) {
var val = place.address_components[i][addressComponets[addressType]];
assignEditFrmAddrFieldsVal(addressType, val );
}
}
if( addrStreet != "")
document.getElementById("clntInfoEditAddr1").value = addrStreet;
}
function assignEditFrmAddrFieldsVal( addressType , val ) {
switch( addressType ) {
case "administrative_area_level_1":
document.getElementById("clntInfoEditState").value = val; break;
case "locality":
document.getElementById("clntInfoEditCity").value = val; break;
// case "country":
// document.getElementById("addressType").value = val; break;
case "postal_code":
document.getElementById("clntInfoEditZip").value = val; break;
case "street_number":
case "route":
addrStreet += " "+val; break;
}
}
function clearPrevEditFrmAddrVals(){
var editClntFrmAddrIDs = ["clntInfoEditState","clntInfoEditCity","clntInfoEditZip","clntInfoEditAddr1"];
addrStreet = "";
for( var frmID in editClntFrmAddrIDs )
wrap(editClntFrmAddrIDs[frmID]).val("");
}
Ich weiß, das ist ein bisschen alt, aber ... Ich dachte, ich sollte mein Wissen teilen und hoffen, dass es jemandem hilft.
@geocodezip ist richtig, Sie können Google nicht ausdrücklich auffordern, nur Postleitzahlergebnisse zurückzugeben. Sie können jedoch Regionen anfordern und dem Benutzer mitteilen, wenn er alles vermasselt hat!
Dies ist der Code, den ich verwende. Es verwendet 2 Eingänge; ein Adresspräfix (Hausname/Hausnummer) und Postleitzahl
Bedarf:
Ein div mit 2 Eingängen (zum Suchen).
Darunter ein div-Container, der Eingaben mit der folgenden ID enthält: (diese können vorangestellt werden)
Jede meiner Benutzereingaben hat die Klasse "InputControl", daher verwende ich diese Funktion in meiner Funktion, um vorherige Werte zu löschen.
Es benutzen
var autoAddr;
function initAutocomplete() {
autoAddr = new google.maps.places.Autocomplete(document.getElementById('AddressSearchField'), { types: ['(regions)'] });
autoAddr.addListener('place_changed', FillInAddress);
}
function FillInAddress() {
GooglePlacesFillAddress(autoAddr, "#AddressCont", "");
}
Die Hauptfunktion
function GooglePlacesFillAddress(Place, ContainerId, AddressPrefix) {
var
place = Place.getPlace(),
arr = ['premise', 'route', 'locality', 'postal_town', 'administrative_area_level_2', 'postal_code', 'country'],
dict = {},
adr = $(ContainerId).find("#" + AddressPrefix + "Address1"),
switched = false,
switchedAgain = false,
searchAgain = $("<p id=\"" + AddressPrefix + "AddressSearchAgain\"><a href=\"javascript:void(0)\" class=\"Under\">I would like to search again</a></p>"),
asc = $("#" + AddressPrefix + "AddressSearchCont"),
adressPrefixValue = $("#" + AddressPrefix + "AddressSearchPrefixField").val().trim();
SlideShow(ContainerId),
$(ContainerId).find("input.InputControl").val(''),
asc.find("#" + AddressPrefix + "AddressSearchField, #" + AddressPrefix + "AddressSearchPrefixField").attr("disabled", "disabled"),
asc.find("#" + AddressPrefix + "AddressSearchFieldButton").addClass("disabled"),
asc.find("#" + AddressPrefix + "AddressSearchPrefixField").after(searchAgain),
searchAgain.on("click", function () {
$(this).remove(),
asc.find("#" + AddressPrefix + "AddressSearchField, #" + AddressPrefix + "AddressSearchPrefixField").removeAttr("disabled").val(''),
asc.find("#" + AddressPrefix + "AddressSearchFieldButton").removeClass("disabled"),
asc.find("#" + AddressPrefix + "AddressSearchPrefixField").focus();
});
if (place.address_components && place.address_components.length)
for (var i = 0; i < place.address_components.length; i++)
for (var j = 0; j < place.address_components[i].types.length; j++)
if ($.inArray(place.address_components[i].types[j], arr) >= 0)
dict[place.address_components[i].types[j]] = place.address_components[i]["long_name"];
$(ContainerId).find("#" + AddressPrefix + "City").val(dict["postal_town"] || '');
$(ContainerId).find("#" + AddressPrefix + "County").val(dict["administrative_area_level_2"] || '');
$(ContainerId).find("#" + AddressPrefix + "Postcode").val(dict["postal_code"] || '');
$(ContainerId).find("#" + AddressPrefix + "Country").val(dict["country"] || 'United Kingdom');
var isPostal = false;
if (place.types && place.types.length)
if ($.inArray("postal_code", place.types) >= 0 && $.inArray("postal_code_prefix", place.types) < 0)
isPostal = true;
// Add street number
InputAdder(adr, adressPrefixValue, true);
// Add premise
if (adressPrefixValue.length == 0 || adr.val().length + (dict["premise"] || '').length > 100)
adr = $(ContainerId).find("#" + AddressPrefix + "Address2"), switched = true;
InputAdder(adr, (dict["premise"] || ''), true);
// Add route
if (adr.val().length + (dict["route"] || '').length > 100) {
adr = $(ContainerId).find("#" + AddressPrefix + (switched ? "City" : "Address2"));
if (switched)
switchedAgain = true;
else
switched = true;
}
InputAdder(adr, (dict["route"] || ''), !switchedAgain, adressPrefixValue.length > 0 && adr.val() == adressPrefixValue);
// Add locality
InputAdder(switched ? adr : $(ContainerId).find("#" + AddressPrefix + "Address2"), (dict["locality"] || ''), !switchedAgain);
if (!isPostal)
WriteBorderedBox(false, ContainerId, "The postcode provided doesn't appear to be complete/valid. Please confirm the below address is correct."),
$(ContainerId).find("#" + AddressPrefix + "Address1").focus();
}
Hilfsfunktionen
function InputAdder(Obj, Text, Post, DontAddComma) {
if (Obj && Text.length > 0) {
var
i = Obj.val().trim() || '',
comma = !!DontAddComma ? "" : ",";
Obj.val(
(Post && i.length > 0 ? i + comma + ' ' : '') +
Text.trim() +
(!Post && i.length > 0 ? comma + ' ' + i : ''));
}
}
function WriteBorderedBox(outcome, identifier, text) {
var
box = $("<div class=\"Bordered" + (outcome ? "Success" : "Error") + "\"><p>" + text + "</p></div>");
$(identifier).before(box);
box.hide().slideDown(function () { $(this).delay(6000).slideUp(function () { $(this).remove(); }); });
}
Wenn du einen Knopf willst (wie ich)
$("#AddressSearchFieldButton").click(function (e) {
var input = document.getElementById("AddressSearchField");
google.maps.event.trigger(input, 'focus')
google.maps.event.trigger(input, 'keydown', { keyCode: 40 });
google.maps.event.trigger(input, 'keydown', { keyCode: 13 });
});