Html实现全国省市区三级联动

news2024/11/13 15:18:39

目录

前言

1.全国省市区的Json数据

2.找到Json数据文件(在此博文绑定资源)之后,放到resource目录下。

3.通过类加载器加载资源文件,读取Json文件

        3.1 创建JsonLoader类

          3.2 注入JsonLoader实体,解析Json文件 

4.构建前端Html页面

5.通过ajax获取从后端获取数据 

6.通过监听事件,完成Html省市区联动 

7.实现效果


前言

       关键技术:SpringBoot、Html、Jquery、js、ajax

        在网上找到的资料都比较乱,对于初学者来说,可能不太友好。以前,我刚开始学习Html的时候,也搞不清楚这个要怎么做,找了好久的资料都没法实现,就算是实现了,也没有完整的教程,现在实现了,整理好了,就想分享一下给每一位热爱编程的小伙伴。

1.全国省市区的Json数据

[
  {
    "province": "北京市",
    "code": "110000",
    "citys": [
      {
        "city": "北京市",
        "code": "110100000000",
        "areas": [
          {
            "area": "东城区",
            "code": "110101000000"
          },
          {
            "area": "西城区",
            "code": "110102000000"
          },
          {
            "area": "朝阳区",
            "code": "110105000000"
          },
          {
            "area": "丰台区",
            "code": "110106000000"
          },
          {
            "area": "石景山区",
            "code": "110107000000"
          },
          {
            "area": "海淀区",
            "code": "110108000000"
          },
          {
            "area": "门头沟区",
            "code": "110109000000"
          },
          {
            "area": "房山区",
            "code": "110111000000"
          },
          {
            "area": "通州区",
            "code": "110112000000"
          },
          {
            "area": "顺义区",
            "code": "110113000000"
          },
          {
            "area": "昌平区",
            "code": "110114000000"
          },
          {
            "area": "大兴区",
            "code": "110115000000"
          },
          {
            "area": "怀柔区",
            "code": "110116000000"
          },
          {
            "area": "平谷区",
            "code": "110117000000"
          },
          {
            "area": "密云区",
            "code": "110118000000"
          },
          {
            "area": "延庆区",
            "code": "110119000000"
          }
        ]
      }
    ]
  }
......此处省略好多个省市区。
]

2.找到Json数据文件(在此博文绑定资源)之后,放到resource目录下。

3.通过类加载器加载资源文件,读取Json文件

        3.1 创建JsonLoader类

package com.company.project.utils;

import com.alibaba.fastjson.JSONArray;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Component;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

@Component
public class JsonLoader {
    @Autowired
    private ResourceLoader resourceLoader;
    public JSONArray loadJsonFile(String fileName) throws IOException {
        Resource resource = resourceLoader.getResource("classpath:" + fileName);
        try (InputStream inputStream = resource.getInputStream();
             BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
            StringBuilder result = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                result.append(line).append("\n");
            }
            return JSONArray.parseArray(result.toString());
        }
    }
}

          3.2 注入JsonLoader实体,解析Json文件 

4.构建前端Html页面

<div class="layui-form" style="margin: 20px;">
        <div class="layui-form-item">
            <label class="layui-form-label">省份:</label>
            <div class="layui-input-block">
                <select class="custom-select" name="province" id="province" lay-verify="required" lay-search="">
                    <option value="">请选择省份</option>
                </select>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">城市:</label>
            <div class="layui-input-block">
                <select class="custom-select"  name="city" id="city" lay-verify="required" lay-search="">
                    <option value="">请选择城市</option>
                </select>
            </div>
        </div>
        <div class="layui-form-item">
            <label class="layui-form-label">区县:</label>
            <div class="layui-input-block">
                <select class="custom-select"  name="county" id="county" lay-verify="required" lay-search="">
                    <option value="">请选择区县</option>
                </select>
            </div>
        </div>
    </div>

5.通过ajax获取从后端获取数据 

 /// 使用jQuery的$.ajax方法
        $.ajax({
            url: ctx + 'zhWeather/getCity', // 你要请求的URL
            type: 'GET', // 请求方式,GET或POST
            dataType: 'json', // 预期服务器返回的数据类型
            data: { // 发送到服务器的数据
            },
            success: function(data) {
                loadData(JSON.stringify(data.data))
                // 请求成功时执行的回调函数
                console.log(data); // 处理返回的数据
            },
            error: function(xhr, status, error) {
                // 请求失败时执行的回调函数
                console.error("请求失败: " + error);
            }
        });

6.通过监听事件,完成Html省市区联动 

 //select2搜索下拉列表样式
        $('.custom-select').select2({
            placeholder: '请选择',
            allowClear: true
        });
        // 假设这是从Ajax请求中获取的,因此我们将其放入一个函数中
        function loadData(data) {
            data = JSON.parse(data)
            // 填充省份
            $.each(data, function(index, province) {
                $('#province').append($('<option>', {
                    value: province.code,
                    text: province.province
                }));
            });

            // 省份选择变化时,填充城市
            $('#province').change(function() {
                var selectedProvinceCode = $(this).val();
                var cityOptions = '';
                $.each(data, function(index, province) {
                    if (province.code === selectedProvinceCode) {
                        $.each(province.citys, function(index, city) {
                            cityOptions += '<option value="' + city.code + '">' + city.city + '</option>';
                        });
                    }
                });
                $('#city').html('<option value="">请选择城市</option>' + cityOptions);
                $('#county').html('<option value="">请选择区县</option>'); // 清除区县选项
            });

            // 城市选择变化时,填充区县(这里省略,逻辑与填充城市类似)
            $('#city').change(function() {
                var selectedCityCode = $(this).val();
                var countyOptions = '<option value="">请选择区县</option>';
                var currentProvinceCode = $('#province').val(); // 获取当前选中的省份代码

                // 遍历data数组找到对应的省份和城市
                $.each(data, function(index, province) {
                    if (province.code === currentProvinceCode) {
                        $.each(province.citys, function(index, city) {
                            if (city.code === selectedCityCode) {
                                // 找到对应的城市后,遍历其区县
                                $.each(city.areas, function(index, area) {
                                    countyOptions += '<option value="' + area.code + '">' + area.area + '</option>';
                                });
                                // 一旦找到匹配的城市,就跳出内层循环
                                return false;
                            }
                        });
                        // 一旦找到匹配的省份,也跳出外层循环(可选,但在这个场景下可能不是必需的)
                        // return false;
                    }
                });

                $('#county').html(countyOptions);
            });
            // 初始化时选择一个省份(可选)
            $('#province').val(data[0].code).trigger('change');
        }

7.实现效果

我会把项目绑定到博文资源文件,希望能够帮助到大家。谢谢

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

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

相关文章

至尊雄心:成为不甘平庸的男人,掌握顶级赢家思维

至尊雄心&#xff1a;成为不甘平庸的男人&#xff0c;掌握顶级赢家思维 嘿&#xff0c;伙计们&#xff01;如果你是个有抱负的男人&#xff0c;或者你想要成为一个有成就的男人&#xff0c;那么这篇文章就是为你量身定做的。这里&#xff0c;我们将一起探讨那些顶级赢家的思维…

开源蓝牙协议栈-Zephyr Bluetooth

关于Zephyr的介绍&#xff0c;参考&#xff1a; https://blog.csdn.net/2201_75889983/article/details/129366754 Zephyr最初是由Wind River公司开发的一个微内核&#xff0c;在2016年的时候成为Linux基金会维护的一个项目&#xff0c;发展至今&#xff0c;已经成为了一个功能…

国内访问github出现无法访问,用Watt Toolkit加速

文章目录 前置1. 访问github出现“无法访问...”2. 安装Watt Toolkit点击下载接受并下载下载渠道 Watt Toolkit 就绪侧栏“网络加速”下拉滚动条勾选github&#xff0c;点右上“一键加速”再次访问 github.com ,可以访问 前置 准备好微软账号 1. 访问github出现“无法访问…”…

vulnhub靶机:Tomato

目录 靶机导入 信息收集 发现 IP 目录扫描 端口扫描 访问 web 漏洞利用 方法1&#xff1a;报错连接拿 shell 方法2&#xff1a; 使用python3进行反弹shell 提权 靶机导入 tomato 下载地址&#xff1a;Tomato: 1 ~ VulnHub 信息收集 发现 IP arp-scan -l 发现靶机 IP…

【Qt】QMainWindow之菜单栏

目录 一.菜单栏 1.概念 2.组成 二.代码创建菜单栏 1.创建菜单栏 2.在菜单栏中添加菜单 3.在菜单中添加菜单项 三.图形化创建菜单栏 1.在打开Qt自带的ui文件界面后&#xff0c;得到以下界面 2.双击点击界面中&#xff08;在这里输入&#xff09;&#xff0c;在菜单栏中进行…

【开端】JAVA日志框架LogFactory

熟悉的一行代码 private static final Log logger LogFactory.getLog(Application.class); 这一行代码就是使用了LogFactory日志框架&#xff0c;对类Application&#xff0c;进行日志输出。 private static final 这里表示虚拟机启动后就创建一个最终的日志对象Log logger 创…

MySQL学习(18):触发器

1.什么是触发器 *触发器是在 insert/update/delete 之前或之后&#xff0c;触发并执行触发器中定义的SQL语句集合。 *日志记录&#xff0c;数据校验等操作使用别名 OLD 和 NEW 来引用触发器中发生变化的记录内容。OLD引用的是触发器变化前的内容&#xff0c;NEW引用的是触发…

鸿蒙Flex布局

效果&#xff1a; 代码&#xff1a; 换行代码参数设置&#xff1a; wrap:FlexWrap.Wrap Entry Component struct FlexCase {State message: string Hello World;build() {Flex({direction:FlexDirection.Row,justifyContent:FlexAlign.SpaceAround,alignItems:ItemAlign.Cen…

QT和Electron之争,谁才是王者,看看界面判断下

QT 和 Electron 都是用于开发跨平台应用程序的框架&#xff0c;但很难简单地判定谁是“王者”&#xff0c;因为它们各有优劣&#xff0c;适用于不同的场景和需求。 QT 是一个成熟的 C 框架&#xff0c;具有以下优点&#xff1a; 性能出色&#xff1a;由于是基于 C 开发&#…

Eureka详解:解锁微服务架构中的服务发现与注册超能力!

Eureka是一款由Netflix开源的服务发现框架&#xff0c;主要用于微服务架构中的服务注册与发现。在使用Eureka时&#xff0c;涉及到配置Eureka Server、配置Eureka Client、服务注册与发现等步骤。 Eureka服务端配置&#xff1a; 引入依赖&#xff1a;在项目的pom.xml文件中添加…

【秋招笔试】24-07-27-OPPO-秋招笔试题(研发岗)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 💡本套卷的题目都是计数相关的题,对这方…

针对一个红队病毒样本逆向分析

近日翻到一个比较新颖的样本&#xff0c;在最终后门载荷释放前运用了不少免杀手段&#xff0c;包括堆栈欺骗&#xff0c;实现反射性调用API&#xff0c;以及DLL侧加载、DLL挖空、HOOK规避等手法&#xff0c;对其执行流程和部分手法做详细分析记录。 样本概述 初始载荷 初始载…

【硬件开发】树莓派4B散热性能

树莓派4B散热性能 树莓派引脚 树莓派 40Pin 引脚对照表 rpi-pins-40-0 注&#xff1a;本表格适用于各版本&#xff0c;并且兼容26Pin的树莓派B&#xff0c;树莓派B为26Pin&#xff0c;其引脚对应于上表的前26Pin。 使用下面这款 GPIO 参考卡片&#xff0c;让引脚功能一目了…

谷粒商城实战笔记-101-分布式基础篇总结

文章目录 一、分布式基础概念二、基础开发三、环境搭建四、开发规范 分布式基础篇已经学习完成&#xff0c;包含了以下4个部分的知识&#xff1a; 1&#xff0c;分布式基础概念2&#xff0c;基础开发3&#xff0c;环境搭建4&#xff0c;开发规范 学习并掌握这部分内容&#x…

超声波眼镜清洗机是智商税吗?最好用的超声波清洗机推荐

大家知道&#xff0c;在咱们生活的环境里。到处充斥着细菌&#xff0c;像衣服上、手上等等地方都很容易被沾染上比细菌&#xff0c;很影响咱们的健康。所以大家会勤洗手&#xff0c;勤换洗衣服&#xff0c;来减少细菌病毒伤害。然而对于戒指、项链、眼镜、手表等配饰细菌&#…

软考:软件设计师 — 9.数据流图

九. 数据流图 数据流图是下午场考试中第一个题目&#xff0c;分值 15 分。通常会考察实体名、存储名、加工名的补充&#xff0c;以及找到缺失的数据流并改正等。 1. 数据平衡原则 数据流的分析依赖于数据平衡原则。 父图与子图之间的平衡 父图与子图之间平衡是指任何一张 …

mp3剪辑音乐怎么剪?手把手教会你4个音频剪辑技巧

在制作创意无限的“矿泉水瓶烟花视频”时&#xff0c;音效的选择与剪辑往往是点睛之笔。想象一下&#xff0c;那绚烂的视觉盛宴搭配上恰到好处的背景音乐&#xff0c;是否能让你的作品更加引人入胜&#xff1f; 而要精准地控制每一个音符的起承转合&#xff0c;一款强大的mp3剪…

【学习笔记】Day 1

一、进度概述 1、配置相关环境——注&#xff1a;暂未完成&#xff0c;还有部分依赖没有补充完整 2、试运行 3、《地震数据全波形反演的深度学习方法》PPT知识梳理方法地震数据全波形反演的深度学 二、详情 1、配置相关环境 深度学习环境配置参考文章如下&a…

VS+Qt+C++点云PCL三维显示编辑系统

程序示例精选 VSQtC点云PCL三维显示编辑系统 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《VSQtC点云PCL三维显示编辑系统》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易…

HttpRequest请求对象和HttpResponse响应对象

HttpRequest请求对象 1.获取请求头 2.获取请求参数 通过请求对象获取请求头 获取GET参数&#xff08;valuerequest.GET.get(参数名称&#xff0c;默认值)&#xff09;获取POST参数valuerequest.POST.get(参数名称&#xff0c;默认值)&#xff09;获取URL参数&#xf…