省市区三级联动
引言
在网页中,经常会遇到需要用户选择地区的场景,如注册表单、地址填写等。为了提供更好的用户体验,我们可以实现一个三级联动的地区选择器,让用户依次选择省份、城市和地区。
效果展示:
只有先选择省份后才可以选择市和区
实现思路
整体实现思路是通过 JavaScript 异步请求一个包含地区数据的 JSON 文件,将数据解析后根据用户的选择动态更新下拉框选项,最终实现三级联动效果。当用户完成地区选择后,会弹出一个提示框显示所选的地区信息,提示框会在 2 秒后自动消失。
HTML 结构搭建
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<style>
#showPlace {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.7);
color: white;
align-items: center;
z-index: 9999;
text-align: center;
line-height: 500px;
display: none;
}
#textCenter {
text-align: center;
}
#textCenter select {
height: 50px;
width: 200px;
text-align: center;
font-size: 20px;
}
</style>
</head>
<body>
<div id="textCenter">
<select id="province" onchange="cityData()">
<option>---请选择省---</option>
</select>
<select id="city" onchange="regionData()">
<option>---请先选择省---</option>
</select>
<select id="region" onchange="showAlert()">
<option>---请先选择省---</option>
</select>
</div>
<div id="showPlace">
<h1>您所在的地区为:</h1>
</div>
<script>
// ... JavaScript 代码 ...
</script>
</body>
- 创建了三个
select
元素,分别用于选择省份、城市和地区,并为每个select
元素设置了初始提示选项。 onchange
事件分别绑定了相应的 JavaScript 函数,用于在用户选择选项时更新下拉框内容或显示提示框。
JavaScript 逻辑实现
1.声明一个变量 data
,用于存储从 ./js/threeGet.json
文件中获取的地区数据。此时变量未赋值,值为 undefined
。
let data;
2. 这部分代码创建了一个 XMLHttpRequest
对象,以异步 GET 请求的方式从 ./js/threeGet.json
文件获取数据,发送请求后监听其状态变化,当请求完成且响应状态码为 200 时,将响应的 JSON 文本解析为 JavaScript 对象,随后调用 showProvince
函数对解析后的数据进行渲染处理。
let xhr = new XMLHttpRequest();
xhr.open('get', './js/threeGet.json', true);
xhr.send();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
let text = xhr.responseText;
// console.log(text);
data = JSON.parse(text);
// console.log(data);
// 渲染函数
showProvince(data);
// console.log(data);
}
};
3.分别通过 document.getElementById
方法获取 HTML 文档中 id
为 province
、city
、region
和 showPlace
的元素,并将它们存储在对应的变量中。
let province = document.getElementById('province');
let city = document.getElementById('city');
let region = document.getElementById('region');
let showPlace = document.getElementById('showPlace');
4.渲染省份函数:定义一个名为 showProvince
的函数,用于渲染省份下拉框的选项。初始化变量 provinceStr
,并赋值为一个禁用且默认选中的 <option>
元素,作为提示信息。使用 for
循环遍历 data
数组,将每个省份的名称拼接成 <option>
元素字符串,并添加到 provinceStr
中。将拼接好的 option
元素字符串赋值给 province
下拉框的 innerHTML
属性,从而更新下拉框的选项。
function showProvince(data) {
let provinceStr = `<option disabled selected>--请选择省份--</option>`;
for (let i = 0; i < data.length; i++) {
provinceStr += `<option >${data[i].province}</option>`;
}
province.innerHTML = provinceStr;
}
5.渲染市级函数:定义一个名为 cityData
的函数,该函数会在用户选择省份后触发(通过 onchange
事件)。初始化变量 cityStr
和 regionStr
,分别用于存储城市和地区下拉框的选项字符串,并设置默认的提示信息。使用外层 for
循环遍历 data
数组,检查每个省份是否与用户选择的省份相同。如果找到匹配的省份,则使用内层 for
循环遍历该省份下的所有城市,并将城市名称拼接成 <option>
元素字符串,添加到 cityStr
中。最后,将 cityStr
赋值给 city
下拉框的 innerHTML
属性,更新城市下拉框的选项;将 regionStr
赋值给 region
下拉框的 innerHTML
属性,重置地区下拉框的选项为提示信息。
function cityData() {
let cityStr = `<option value="" disabled selected>--请选择城市--</option>`;
let regionStr = `<option value="" disabled selected>--请先选择城市后选择地区--</option>`;
for (let i = 0; i < data.length; i++) {
if (data[i].province == province.value) {
for (let s = 0; s < data[i].child.length; s++) {
cityStr += `<option>${ data[i].child[s].city}</option>`;
}
}
}
city.innerHTML = cityStr;
region.innerHTML = regionStr;
}
6.渲染区级函数:定义一个名为 regionData
的函数,该函数会在用户选择城市后触发(通过 onchange
事件)。初始化变量 regionStr
,用于存储地区下拉框的选项字符串,使用三层嵌套的 for
循环:外层 for
循环遍历 data
数组,找到用户选择的省份。第二层 for
循环遍历该省份下的所有城市,找到用户选择的城市。内层 for
循环遍历该城市下的所有地区,并将地区名称拼接成 <option>
元素字符串,添加到 regionStr
中。最后,将 regionStr
赋值给 region
下拉框的 innerHTML
属性,更新地区下拉框的选项。
function regionData() {
let regionStr = `<option value="" disabled selected>--请选择地区--</option>`;
for (let i = 0; i < data.length; i++) {
if (data[i].province == province.value) {
for (let s = 0; s < data[i].child.length; s++) {
if (data[i].child[s].city == city.value) {
for (let c = 0; c < data[i].child[s].child.length; c++) {
regionStr += `<option>${data[i].child[s].child[c]}</option>`;
}
}
}
}
}
region.innerHTML = regionStr;
}
7.地区信息框 :定义一个名为 showAlert
的函数,该函数会在用户选择地区后触发(通过 onchange
事件)。构建一个包含用户所选省份、城市和地区信息的 HTML 字符串 str
,并将地区信息用红色显示。将 str
赋值给 showPlace
元素的 innerHTML
属性,更新提示框的内容。将 showPlace
样式设置为 "block"
,显示出来。使用 setTimeout
函数设置一个定时器,在 2000 毫秒后将 showPlace
元素的样式设置为 "none"
,隐藏起来。
function showAlert() {
let str = `<h1>您所在的地区为:<span style="color: red;">${province.value} ${city.value} ${region.value}</span></h1>`;
showPlace.innerHTML = str;
showPlace.style.display = "block";
setTimeout(function() {
showPlace.style.display = "none";
}, 2000)
}