省市区三级联动

news2025/1/28 1:23:28

引言

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

效果展示:

只有先选择省份后才可以选择市和区

实现思路

整体实现思路是通过 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 为 provincecityregion 和 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)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2283668.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Fullcalendar @fullcalendar/react 样式错乱丢失问题和导致页面卡顿崩溃问题

问题描述&#xff1a; 我使用 fullcalendar的react版本时&#xff0c;出现了一个诡异的问题&#xff0c;当我切换到 一个iframe页面时&#xff08;整个页面是一个iframe嵌入的&#xff09;&#xff0c;再切换回来日历的样式丢失了&#xff01;不仅丢失了样式还导致页面崩溃了&…

dm8在Linux环境安装精简步骤说明(2024年12月更新版dm8)

dm8在Linux环境安装详细步骤 - - 2025年1月之后dm8 环境介绍1 修改操作系统资源限制2 操作系统创建用户3 操作系统配置4 数据库安装5 初始化数据库6 实例参数优化7 登录数据库配置归档与备份8 配置审计9 创建用户10 屏蔽关键字与数据库兼容模式11 jdbc连接串配置12 更多达梦数据…

S4 HANA更改Tax base Amount的字段控制

本文主要介绍在S4 HANA OP中Tax base Amount的字段控制相关设置。具体请参照如下内容&#xff1a; 1. 更改Tax base Amount的字段控制 以上配置用于控制FB60/FB65/FB70/FB75/MIRO的页签“Tax”界面是否可以修改“Tax base Amount”&#xff0c; 如果勾选Change 表示可以修改T…

JVM堆空间

一、堆空间的核心概述 一个JVM实例只存在一个堆内存&#xff0c;堆也是Java内存管理的核心区域。Java堆区在JVM启动的时候即被创建&#xff0c;其空间大小也就确定了。是JVM管理的最大一块内存空间。 堆内存的大小是可以调节的。堆可以处于物理上不连续的内存空间中&#xff…

《深入解析:DOS检测的技术原理与方法》

DDOS入侵检测与防御 一、实现Linux下DDOS的入侵检测与防御 利用Python编程实现对wrk的泛洪攻击检测&#xff0c;并让程序触发调用Linux命令实现防御: 1、泛洪攻击的检测&#xff0c;可以考虑使用的命令&#xff0c;这些命令可以通过Python进行调用和分析 (1) netstat -ant …

PID如何调试,如何配置P,I,D值,如何适配pwm的定时器配置,如何给小车配电源

首先你要搞清楚PID公式原理 PID算法解析PID算法解析_pid滤波算法-CSDN博客 然后你要明白调试原理 首先要确定一个电源 电源决定了你后面调试时电机转动速度大小和pwm占空比的关系&#xff0c;电源电压越大那要转到同一速度所需的占空比越小&#xff0c;反之电源电压越小那要…

小马模拟器-第三方全街机游戏模拟器

链接&#xff1a;https://pan.xunlei.com/s/VOHSiB6st-f3RWlIK01MS2fUA1?pwd44v7# 1.小马模拟器是一款完全免费的游戏模拟器软件&#xff0c;支持街机&#xff08;FBA,MAME,PGM2&#xff09;,3DS,WII,NGC,DC,SS,DOS,MD,WSC,NDS,JAVA,PCE,FC,SFC,GBA,GBC,PSP,PS,N64等多种游戏…

微信小程序date picker的一些说明

微信小程序的picker是一个功能强大的组件&#xff0c;它可以是一个普通选择器&#xff0c;也可以是多项选择器&#xff0c;也可以是时间、日期、省市区选择器。 官方文档在这里 这里讲一下date picker的用法。 <view class"section"><view class"se…

【算法】递归型枚举与回溯剪枝初识

递归型枚举与回溯剪枝初识 1.枚举子集2.组合型枚举3.枚举排列4.全排列问题 什么是搜索&#xff1f;搜索&#xff0c;是一种枚举&#xff0c;通过穷举所有的情况来找到最优解&#xff0c;或者统计合法解的个数。因此&#xff0c;搜索有时候也叫作暴搜。搜索一般分为深度优先搜索…

rocketmq-product-send方法源码分析

先看有哪些send方法 首先说红圈的 有3个红圈。归类成3种发送方式。假设前提条件&#xff0c;发送的topic&#xff0c;有3个broker&#xff0c;每个broker总共4个write队列&#xff0c;总共有12个队列。 普通发送。负载均衡12个队列。指定超时时间指定MessageQueue,发送&#…

69.在 Vue 3 中使用 OpenLayers 拖拽实现放大区域的效果(DragPan)

引言 在现代 Web 开发中&#xff0c;地图功能已经成为许多应用的重要组成部分。OpenLayers 是一个功能强大的开源地图库&#xff0c;支持多种地图源和交互操作。Vue 3 是一个流行的前端框架&#xff0c;以其响应式数据和组件化开发著称。本文将介绍如何在 Vue 3 中集成 OpenLa…

77,【1】.[CISCN2019 华东南赛区]Web4

有句英文&#xff0c;看看什么意思 好像也可以不看 进入靶场 点击蓝色字体 我勒个豆&#xff0c;百度哇 所以重点应该在url上&#xff0c;属于任意文件读取类型 接下来该判断框架了 常见的web框架如下 一&#xff0c;Python 框架 1.Flask URL 示例 1&#xff1a;http://…

手撕B-树

一、概述 1.历史 B树&#xff08;B-Tree&#xff09;结构是一种高效存储和查询数据的方法&#xff0c;它的历史可以追溯到1970年代早期。B树的发明人Rudolf Bayer和Edward M. McCreight分别发表了一篇论文介绍了B树。这篇论文是1972年发表于《ACM Transactions on Database S…

一文简单回顾复习Java基础概念

还是和往常一样&#xff0c;我以提问的方式回顾复习&#xff0c;今天回顾下Java小白入门应该知道的一些基础知识 Java语言有哪些特点呢&#xff1f; Java语言的特点有&#xff1a; 面向对象&#xff0c;主要是封装、继承、多态&#xff1b;平台无关性&#xff0c;“一次编写…

GCC之编译(8)AR打包命令

GCC之(8)AR二进制打包命令 Author: Once Day Date: 2025年1月23日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章请查看专栏: Linux实践记录_Once-Day的博客-C…

2.1.3 第一个工程,点灯!

新建工程 点击菜单栏左上角&#xff0c;新建工程或者选择“文件”-“新建工程”&#xff0c;选择工程类型“标准工程”选择设备类型和编程语言&#xff0c;并指定工程文件名及保存路径&#xff0c;如下图所示&#xff1a; 选择工程类型为“标准工程” 选择主模块机型&#x…

图像处理算法研究的程序框架

目录 1 程序框架简介 2 C#图像读取、显示、保存模块 3 C动态库图像算法模块 4 C#调用C动态库 5 演示Demo 5.1 开发环境 5.2 功能介绍 5.3 下载地址 参考 1 程序框架简介 一个图像处理算法研究的常用程序逻辑框架&#xff0c;如下图所示 在该框架中&#xff0c;将图像处…

计算机工程:解锁未来科技之门!

计算机工程与应用是一个充满无限可能性的领域。随着科技的迅猛发展&#xff0c;计算机技术已经深深渗透到我们生活的方方面面&#xff0c;从医疗、金融到教育&#xff0c;无一不在彰显着计算机工程的巨大魅力和潜力。 在医疗行业&#xff0c;计算机技术的应用尤为突出。比如&a…

Linux初识——基本指令(2)

本文将继续从上篇末尾讲起&#xff0c;讲解我们剩下的基本指令 一、剩余的基本指令 1、mv mv指令是move&#xff08;移动&#xff09;的缩写&#xff0c;其功能为&#xff1a;1.剪切文件、目录。2.重命名 先演示下重命名&#xff0c;假设我想把当前目录下的di34改成dir5 那…

单片机-STM32 WIFI模块--ESP8266 (十二)

1.WIFI模块--ESP8266 名字由来&#xff1a; Wi-Fi这个术语被人们普遍误以为是指无线保真&#xff08;Wireless Fidelity&#xff09;&#xff0c;并且即便是Wi-Fi联盟本身也经常在新闻稿和文件中使用“Wireless Fidelity”这个词&#xff0c;Wi-Fi还出现在ITAA的一个论文中。…