省市区三级联动
引言
在网页中,经常会遇到需要用户选择地区的场景,如注册表单、地址填写等。为了提供更好的用户体验,我们可以实现一个三级联动的地区选择器,让用户依次选择省份、城市和地区。
效果展示:
只有先选择省份后才可以选择市和区




实现思路
整体实现思路是通过 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近邻)规格…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
