En este ejercicio utilizaremos la API de Copomex, una base de datos que tiene todos los códigos postales, los estados de la república de Mexico, las colonias, municipios….
Vamos a crear un archivo denominado selects-anidados.html en el cual vamos a trabajar toda nuestra sintaxis.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Selects Anidados</title>
</head>
<body>
<h1>Selects Anidados</h1>
<h2>México</h2>
<label for="select-primary">Estados</label>
<select name="primary" id="select-primary">
<option value="">Elige un estado</option>
</select>
<p></p>
<label for="select-secondary">Municipios</label>
<select name="secondary" id="select-secondary">
<option value="">Elige un municipio</option>
</select>
<p></p>
<label for="select-third">Colonias</label>
<select name="third" id="select-third">
<option value="">Elige una colonia</option>
</select>
<p></p>
<script>
const d = document,
$selectPrimary = d.getElementById("select-primary"),
$selectSecondary = d.getElementById("select-secondary"),
$selectThird = d.getElementById("select-third");
function loadStates() {
fetch("https://api.copomex.com/query/get_estados?token=pruebas")
.then((res) => (res.ok ? res.json() : Promise.reject(res)))
.then((json) => {
console.log(json);
let $options = `<option value="">Elige un estado</option>`;
json.response.estado.forEach((el) => {
$options += `<option value="${el}">${el}</option>`;
$selectPrimary.innerHTML = $options;
});
})
.catch((err) => {
console.log(err);
let message = err.status || "Ocurrió un error";
$selectPrimary.nextElementSibling.innerHTML = `Error ${err.status}: ${message}`;
});
}
function loadTowns(state) {
fetch(
`https://api.copomex.com/query/get_municipio_por_estado/${state}?token=pruebas`
)
.then((res) => (res.ok ? res.json() : Promise.reject(res)))
.then((json) => {
console.log(json);
let $options = `<option value="">Elige un municipio</option>`;
json.response.municipios.forEach((el) => {
$options += `<option value="${el}">${el}</option>`;
$selectSecondary.innerHTML = $options;
});
})
.catch((err) => {
console.log(err);
let message = err.status || "Ocurrió un error";
$selectSecondary.nextElementSibling.innerHTML = `Error ${err.status}: ${message}`;
});
}
function loadSuburbs(suburb) {
fetch(
`https://api.copomex.com/query/get_colonia_por_municipio/${suburb}?token=pruebas`
)
.then((res) => (res.ok ? res.json() : Promise.reject(res)))
.then((json) => {
console.log(json);
let $options = `<option value="">Elige una colonia</option>`;
json.response.colonia.forEach((el) => {
$options += `<option value="${el}">${el}</option>`;
$selectThird.innerHTML = $options;
});
})
.catch((err) => {
console.log(err);
let message = err.status || "Ocurrió un error";
$selectThird.nextElementSibling.innerHTML = `Error ${err.status}: ${message}`;
});
}
d.addEventListener("DOMContentLoaded", loadStates);
$selectPrimary.addEventListener("change", (e) =>
loadTowns(e.target.value)
);
$selectSecondary.addEventListener("change", (e) => {
loadSuburbs(e.target.value);
});
</script>
</body>
</html>
