Lernen Sie, wie Sie ein vollständiges Adressformular mit Land → Bundesland → Stadt Dropdowns mit den Select-Endpunkten von CountryDataAPI erstellen.
Diese Anleitung zeigt Ihnen, wie Sie kaskadierende Select-Eingaben erstellen für:
Die Select-Endpunkte sind für Formulare optimiert und geben nur die Felder id und name zurück für minimale Payload-Größe und maximale Leistung.
Laden Sie zunächst alle Länder beim Seitenaufruf. Länder ändern sich selten, daher können Sie diese Daten für bessere Leistung im localStorage zwischenspeichern.
const API_KEY = 'ihr-api-schluessel';
const BASE_URL = 'https://api.countrydataapi.com/v1';
async function loadCountries() {
try {
const response = await fetch(
`${BASE_URL}/select/countries?apikey=${API_KEY}&lang=de`
);
const { success, data, error } = await response.json();
if (!success) {
console.error('API-Fehler:', error);
return;
}
const countrySelect = document.getElementById('country');
data.forEach(country => {
const option = new Option(country.name, country.id);
countrySelect.add(option);
});
} catch (err) {
console.error('Netzwerkfehler:', err);
}
}
// Beim Seitenladen aufrufen
document.addEventListener('DOMContentLoaded', loadCountries);
Tipp: Speichern Sie die Länderliste im localStorage zwischen, um wiederholte API-Aufrufe zu vermeiden. Länder ändern sich nicht häufig!
Wenn ein Benutzer ein Land auswählt, laden Sie die entsprechenden Bundesländer/Provinzen und setzen Sie das Stadt-Dropdown zurück.
document.getElementById('country').addEventListener('change', async (e) => {
const countryId = e.target.value;
const stateSelect = document.getElementById('state');
const citySelect = document.getElementById('city');
// Bundesland- und Stadt-Dropdowns zurücksetzen
stateSelect.innerHTML = '<option value="">Bundesland auswählen...</option>';
citySelect.innerHTML = '<option value="">Stadt auswählen...</option>';
stateSelect.disabled = true;
citySelect.disabled = true;
if (!countryId) return;
try {
const response = await fetch(
`${BASE_URL}/select/states?apikey=${API_KEY}&country=${countryId}&lang=de`
);
const { success, data, error } = await response.json();
if (!success) {
console.error('API-Fehler:', error);
return;
}
data.forEach(state => {
stateSelect.add(new Option(state.name, state.id));
});
stateSelect.disabled = false;
} catch (err) {
console.error('Netzwerkfehler:', err);
}
});
Laden Sie abschließend die Städte, wenn ein Bundesland ausgewählt wird.
document.getElementById('state').addEventListener('change', async (e) => {
const stateId = e.target.value;
const citySelect = document.getElementById('city');
// Stadt-Dropdown zurücksetzen
citySelect.innerHTML = '<option value="">Stadt auswählen...</option>';
citySelect.disabled = true;
if (!stateId) return;
try {
const response = await fetch(
`${BASE_URL}/select/cities?apikey=${API_KEY}&state=${stateId}&lang=de`
);
const { success, data, error } = await response.json();
if (!success) {
console.error('API-Fehler:', error);
return;
}
data.forEach(city => {
citySelect.add(new Option(city.name, city.id));
});
citySelect.disabled = false;
} catch (err) {
console.error('Netzwerkfehler:', err);
}
});
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Adressformular - CountryDataAPI</title>
<style>
body {
font-family: system-ui, -apple-system, sans-serif;
max-width: 600px;
margin: 50px auto;
padding: 20px;
}
.form-group {
margin-bottom: 20px;
}
label {
display: block;
margin-bottom: 8px;
font-weight: 600;
color: #333;
}
select {
width: 100%;
padding: 10px;
border: 2px solid #e2e8f0;
border-radius: 6px;
font-size: 16px;
background-color: white;
cursor: pointer;
}
select:disabled {
background-color: #f7fafc;
cursor: not-allowed;
opacity: 0.6;
}
select:focus {
outline: none;
border-color: #3b82f6;
}
button {
background-color: #3b82f6;
color: white;
padding: 12px 24px;
border: none;
border-radius: 6px;
font-size: 16px;
font-weight: 600;
cursor: pointer;
width: 100%;
}
button:disabled {
background-color: #cbd5e0;
cursor: not-allowed;
}
</style>
</head>
<body>
<h1>Adressformular</h1>
<form id="address-form">
<div class="form-group">
<label for="country">Land *</label>
<select id="country" name="country" required>
<option value="">Land auswählen...</option>
</select>
</div>
<div class="form-group">
<label for="state">Bundesland *</label>
<select id="state" name="state" required disabled>
<option value="">Bundesland auswählen...</option>
</select>
</div>
<div class="form-group">
<label for="city">Stadt *</label>
<select id="city" name="city" required disabled>
<option value="">Stadt auswählen...</option>
</select>
</div>
<div class="form-group">
<label for="street">Straße *</label>
<input type="text" id="street" name="street" required
style="width: 100%; padding: 10px; border: 2px solid #e2e8f0; border-radius: 6px;">
</div>
<button type="submit">Adresse Absenden</button>
</form>
<script src="address-form.js"></script>
</body>
</html>
Behandeln Sie die Formularübermittlung, um die ausgewählten Werte zu erhalten:
document.getElementById('address-form').addEventListener('submit', (e) => {
e.preventDefault();
const formData = new FormData(e.target);
const address = {
country: formData.get('country'),
state: formData.get('state'),
city: formData.get('city'),
street: formData.get('street')
};
console.log('Adresse übermittelt:', address);
// An Ihr Backend senden oder nach Bedarf verarbeiten
// fetch('/api/save-address', {
// method: 'POST',
// headers: { 'Content-Type': 'application/json' },
// body: JSON.stringify(address)
// });
});
Diese Implementierung ist sehr effizient beim Token-Verbrauch:
Beispiel: Ein Benutzer, der das Formular vollständig ausfüllt, verbraucht nur 3 Tokens insgesamt.
Länder ändern sich nicht oft. Speichern Sie sie im localStorage zwischen:
async function loadCountries() {
const cached = localStorage.getItem('countries');
if (cached) {
const data = JSON.parse(cached);
populateCountrySelect(data);
return;
}
const response = await fetch(
`${BASE_URL}/select/countries?apikey=${API_KEY}&lang=de`
);
const { success, data } = await response.json();
if (success) {
localStorage.setItem('countries', JSON.stringify(data));
populateCountrySelect(data);
}
}
function populateCountrySelect(countries) {
const select = document.getElementById('country');
countries.forEach(country => {
select.add(new Option(country.name, country.id));
});
}
Zeigen Sie visuelles Feedback während des Datenladens:
async function loadStates(countryId) {
const stateSelect = document.getElementById('state');
stateSelect.innerHTML = '<option>Wird geladen...</option>';
stateSelect.disabled = true;
// ... Bundesländer abrufen
stateSelect.disabled = false;
}
Wenn Sie ein durchsuchbares Dropdown hinzufügen, verwenden Sie Debounce für die Eingabe:
let debounceTimer;
searchInput.addEventListener('input', (e) => {
clearTimeout(debounceTimer);
debounceTimer = setTimeout(() => {
filterOptions(e.target.value);
}, 300);
});
Bieten Sie immer benutzerfreundliche Fehlermeldungen:
try {
// API-Aufruf
} catch (err) {
const select = document.getElementById('state');
select.innerHTML = '<option>Fehler beim Laden der Bundesländer. Bitte erneut versuchen.</option>';
}
Die API unterstützt mehrere Sprachen. Ändern Sie den lang-Parameter:
// Spanisch
`${BASE_URL}/select/countries?apikey=${API_KEY}&lang=es`
// Portugiesisch
`${BASE_URL}/select/countries?apikey=${API_KEY}&lang=pt`
// Französisch
`${BASE_URL}/select/countries?apikey=${API_KEY}&lang=fr`
// Deutsch
`${BASE_URL}/select/countries?apikey=${API_KEY}&lang=de`
// Italienisch
`${BASE_URL}/select/countries?apikey=${API_KEY}&lang=it`
Wenn Sie Fragen haben oder Unterstützung benötigen:
Profi-Tipp: Für Produktionsanwendungen sollten Sie erwägen, eine benutzerdefinierte Dropdown-Komponente mit Suchfunktionalität zu implementieren, um Länder mit vielen Bundesländern/Städten zu handhaben. Bibliotheken wie Select2, Choices.js oder benutzerdefinierte Autocomplete können die Benutzererfahrung erheblich verbessern.