省市区三级联动
引言
在网页中,经常会遇到需要用户选择地区的场景,如注册表单、地址填写等。为了提供更好的用户体验,我们可以实现一个三级联动的地区选择器,让用户依次选择省份、城市和地区。
效果展示:
只有先选择省份后才可以选择市和区
实现思路
整体实现思路是通过 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)
}
相关文章:

省市区三级联动
引言 在网页中,经常会遇到需要用户选择地区的场景,如注册表单、地址填写等。为了提供更好的用户体验,我们可以实现一个三级联动的地区选择器,让用户依次选择省份、城市和地区。 效果展示: 只有先选择省份后才可以选择…...
springboot 动态配置定时任务
要在Spring Boot中动态配置定时任务,可以使用ScheduledTaskRegistrar类来实现。 首先,创建一个定时任务类,该类需要实现Runnable接口。例如: Component public class MyTask implements Runnable {Overridepublic void run() {/…...

数据结构与算法学习笔记----求组合数
数据结构与算法学习笔记----求组合数 author: 明月清了个风 first publish time: 2025.1.27 ps⭐️一组求组合数的模版题,因为数据范围的不同要用不同的方法进行求解,涉及了很多之前的东西快速幂,逆元,质数,高精度等…...

Arouter详解・常见面试题
前言:ARouter是一个用于 Android App 进行组件化改造的路由框架 —— 支持模块间的路由、通信、解耦。 一、路由简介: 路由:就是通过互联的网络把信息从源地址传输到目的地址的活动。完成路由这个操作的实体设备就是 路由器(Rout…...

全志开发板 视频输入框架
笔记来源于百问网出品的教程。 1.VIN camera驱动框架 • 使用过程中可简单的看成是vin 模块 device 模块af driver flash 控制模块的方式; • vin.c 是驱动的主要功能实现,包括注册/注销、参数读取、与v4l2 上层接口、与各device 的下层接口、中断处…...
寒假学web--day10
简介 一些高级的反序列化 phar反序列化 phar类似于java的jar包,将多个php文件合并为独立的压缩包,不用解压就能执行里面的php文件,支持web服务器和命令行 metadata $phar->setmetadata($h); metadata可以存放一个类实例,…...

【全栈】SprintBoot+vue3迷你商城(9)
【全栈】SprintBootvue3迷你商城(9) 往期的文章都在这里啦,大家有兴趣可以看一下 后端部分: 【全栈】SprintBootvue3迷你商城(1) 【全栈】SprintBootvue3迷你商城(2) 【全栈】Spr…...

系统思考—问题分析
很多中小企业都在面对转型的难题:市场变化快,资源有限,团队协作不畅……这些问题似乎总是困扰着我们。就像最近和一位企业主交流时,他提到:“我们团队每天都很忙,但效率始终没见提升,感觉像是在…...

系统架构设计师教材:信息系统及信息安全
信息系统 信息系统的5个基本功能:输入、存储、处理、输出和控制。信息系统的生命周期分为4个阶段,即产生阶段、开发阶段、运行阶段和消亡阶段。 信息系统建设原则 1. 高层管理人员介入原则:只有高层管理人员才能知道企业究竟需要什么样的信…...

美国三种主要的个人数据产业模式简析
文章目录 前言一、个人征信(Credit Reporting)模式1、定义:2、特点:数据来源:核心功能:服务对象:代表性公司:监管框架:示例应用:二、面向垂直场景的个人数据公司(Consumer Reporting,消费者报告模式)1、定义:2、特点:数据来源:核心功能:服务对象:主要公司:监…...

js手撕 | 使用css画一个三角形 使用js修改元素样式 驼峰格式与“-”格式相互转化
1.使用css画一个三角形 借助 border 实现,在 width 和 height 都为 0 时,设置 border,便会呈现三角形。想要哪个方向的三角形,设置其他三边为 透明即可。同时,可以通过调整不同边的宽度,来调整三角形的高度…...
每日一道算法题
题目:最长递增子序列的个数 给定一个未排序的整数数组,找到最长递增子序列的个数。 示例 1 输入:nums [1,3,5,4,7]输出:2解释:有两个最长递增子序列,分别是 [1,3,4,7] 和 [1,3,5,7] 。 示例 2 输入&a…...

低代码系统-产品架构案例介绍、明道云(十一)
明道云HAP-超级应用平台(Hyper Application Platform),其实就是企业级应用平台,跟微搭类似。 通过自设计底层架构,兼容各种平台,使用低代码做到应用搭建、应用运维。 企业级应用平台最大的特点就是隐藏在冰山下的功能很深…...

论文笔记(六十三)Understanding Diffusion Models: A Unified Perspective(三)
Understanding Diffusion Models: A Unified Perspective(三) 文章概括 文章概括 引用: article{luo2022understanding,title{Understanding diffusion models: A unified perspective},author{Luo, Calvin},journal{arXiv preprint arXiv:…...

利用机器学习创建基于位置的推荐程序
推荐系统被广泛应用于不同的应用程序中,用于预测用户对产品或服务的偏好或评价。在过去的几分钟或几小时里,你很可能在网上遇到过或与某种类型的推荐系统进行过互动。这些推荐系统有不同的类型,其中最突出的包括基于内容的过滤和协作过滤。在…...
每日一题 429. N 叉树的层序遍历
429. N 叉树的层序遍历 /*class Solution { public:vector<vector<int>> levelOrder(Node* root) {queue<Node*> que;que.push(root);vector<vector<int>> ans;if(root nullptr){return ans;}while(!que.empty()){int sizeQue que.size();vec…...
AIP-132 标准方法:List
编号132原文链接AIP-132: Standard methods: List状态批准创建日期2019-01-21更新日期2022-06-02 在许多API中,通常会向集合URI(例如 /v1/publishers/1/books )发出GET请求,获取集合中资源的列表。 面向资源设计(AIP…...

CSAPP学习:前言
前言 本书简称CS:APP。 背景知识 一些基础的C语言知识 如何阅读 Do-做系统 在真正的系统上解决具体的问题,或是编写和运行程序。 章节 2025-1-27 个人认为如下章节将会对学习408中的操作系统与计算机组成原理提供帮助,于是先凭借记忆将其简单…...
【统计的思想】假设检验(二)
假设检验是根据人为设定的显著水平,对被测对象的总体质量特性进行统计推断的方法。 如果我们通过假设检验否定了零假设,只是说明在设定的显著水平下,零假设成立的概率比较小,并不是说零假设就肯定不成立。如果零假设事实上是成立…...
KNN算法学习实践
1.理论学习 原文链接 ShowMeAI知识社区 2.案例实践 假如一套房子打算出租,但不知道市场价格,可以根据房子的规格(面积、房间数量、厕所数量、容纳人数等),在已有数据集中查找相似(K近邻)规格…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...