Signatur
Beschreibung
Die schreibgeschützte Eigenschaft country des Interfaces ContactAddress enthält das Land einer Postadresse. Der Wert ist ein Ländercode aus zwei Großbuchstaben nach ISO 3166-1 alpha-2, zum Beispiel "DE" für Deutschland, "CH" für die Schweiz oder "US" für die Vereinigten Staaten.
ContactAddress-Objekte erzeugt man nicht selbst. Man bekommt sie von der Contact Picker API: Ruft man navigator.contacts.select() mit der Eigenschaft "address" auf, enthält jeder ausgewählte Kontakt ein Array address mit ContactAddress-Einträgen. ContactAddress erbt von PaymentAddress, die Eigenschaft ist also dieselbe wie bei PaymentAddress.country.
Typische Einsatzfälle sind Formulare, die Liefer- oder Rechnungsadressen aus dem Adressbuch des Geräts vorausfüllen. Mit dem Ländercode kann man eine Länderauswahl vorbelegen, länderspezifische Regeln prüfen (z. B. das Format der Postleitzahl oder ob in dieses Land geliefert wird) oder mit Intl.DisplayNames einen lesbaren, übersetzten Ländernamen anzeigen.
Enthält der Kontakt kein Land, ist der Wert ein leerer String. Er ist nicht null. Prüfe den Wert deshalb vor der Verwendung.
Rückgabewert
"DE"). Ist kein Land bekannt, wird ein leerer String "" zurückgegeben.Beispiele
Land aus einem ausgewählten Kontakt auslesen
const button = document.querySelector('#kontakt-waehlen');
button.addEventListener('click', async () => {
// Die API gibt es nur in wenigen Browsern
if (!('contacts' in navigator)) {
console.warn('Contact Picker API wird nicht unterstützt.');
return;
}
const supported = await navigator.contacts.getProperties();
if (!supported.includes('address')) {
console.warn('Adressen können nicht abgefragt werden.');
return;
}
try {
const [contact] = await navigator.contacts.select(['name', 'address']);
const address = contact?.address?.[0];
console.log(address ? address.country || '(kein Land)' : '(keine Adresse)');
} catch (err) {
console.error('Auswahl abgebrochen oder fehlgeschlagen:', err);
}
});
Ländercode in lesbaren Ländernamen umwandeln
const laenderNamen = new Intl.DisplayNames(['de'], { type: 'region' });
const formatCountry = (contactAddress) => {
const code = contactAddress.country;
return code ? laenderNamen.of(code) : 'Unbekanntes Land';
};
const pickAddress = async () => {
const [contact] = await navigator.contacts.select(['address']);
const address = contact?.address?.[0];
if (address) {
console.log(formatCountry(address));
}
};
document.querySelector('#adresse').addEventListener('click', pickAddress);
Lieferland prüfen und Formular vorausfüllen
const LIEFERLAENDER = new Set(['DE', 'AT', 'CH']);
const fillShippingForm = async () => {
const contacts = await navigator.contacts.select(['name', 'address'], { multiple: false });
const address = contacts[0]?.address?.find((a) => LIEFERLAENDER.has(a.country));
if (!address) {
alert('Keine Adresse in einem unserer Lieferländer gefunden.');
return;
}
document.querySelector('#land').value = address.country;
document.querySelector('#plz').value = address.postalCode;
document.querySelector('#ort').value = address.city;
document.querySelector('#strasse').value = address.addressLine.join(', ');
};
document.querySelector('#aus-kontakten').addEventListener('click', fillShippingForm);
// Wichtig · Fallstricke
- Experimentell und wenig unterstützt: Die Contact Picker API gibt es praktisch nur in Chrome für Android (ab Version 80). Desktop-Browser, Firefox und Safari unterstützen sie standardmäßig nicht. Prüfe deshalb immer mit
'contacts' in navigatorundnavigator.contacts.getProperties(), ob sie verfügbar ist, und biete eine Eingabe von Hand als Ersatz an. - Sicherer Kontext und Nutzeraktion:
navigator.contacts.select()funktioniert nur über HTTPS, nur im obersten Browsing-Kontext (nicht in iframes) und nur als Reaktion auf eine Nutzeraktion, etwa einen Klick. Sonst wird das Promise abgelehnt. - Leerer String statt
null: Hat der Kontakt kein Land, istcountry"". Übergibst du diesen Wert ungeprüft anIntl.DisplayNames.prototype.of(), wird einRangeErrorausgelöst. - Keine Garantie für gültige Codes: Die Daten kommen aus dem Adressbuch des Nutzers. Prüfe den Wert serverseitig trotzdem, bevor du ihn z. B. für Versandkosten verwendest.
- Datenschutz: Adressen sind personenbezogene Daten. Fordere nur die Eigenschaften an, die du wirklich brauchst.