多级联动下拉菜单是前端常见的效果,省市区三级联动又属于其中最典型的案例。多级联动一般都是与数据相关联的,根据数据来生成和修改联动的下拉菜单。完成一个多级联动效果,有助于增强对数据处理的能力。

本实例以省市区三级联动为例,来说明具体是如何使用javascript来关联数据,实现联动下拉菜单。学习本教程之前,读者需要具备html和css技能,同时需要有简单的javascript基础。

这里先准备三个select元素,如下所示:

  1. <div class="select_wrap">
  2. <span>省:</span>
  3. <select id="province">
  4. <option value="">请选择</option>
  5. </select>
  6. <span>市:</span>
  7. <select id="city">
  8. <option value="">请选择</option>
  9. </select>
  10. <span>区/县:</span>
  11. <select id="county">
  12. <option value="">请选择</option>
  13. </select>
  14. </div>

再准备一些城市相关数据,本实例只列举了少量数量。如下所示:

  1. var data = {
  2. "北京市": {
  3. "市辖区": ["东城区", "西城区", "朝阳区", "丰台区", "石景山区", "海淀区", "门头沟区", "房山区", "通州区", "顺义区", "昌平区", "大兴区", "怀柔区", "平谷区", "密云区", "延庆区"]
  4. },
  5. "河北省": {
  6. "石家庄市": ["长安区", "桥西区", "新华区", "井陉矿区", "裕华区", "藁城区", "鹿泉区", "栾城区", "井陉县", "正定县", "行唐县", "灵寿县", "高邑县", "深泽县", "赞皇县", "无极县", "平山县", "元氏县", "赵县", "石家庄高新技术产业开发区", "石家庄循环化工园区", "辛集市", "晋州市", "新乐市"],
  7. "唐山市": ["路南区", "路北区", "古冶区", "开平区", "丰南区", "丰润区", "曹妃甸区", "滦县", "滦南县", "乐亭县", "迁西县", "玉田县", "唐山市芦台经济技术开发区", "唐山市汉沽管理区", "唐山高新技术产业开发区", "河北唐山海港经济开发区", "遵化市", "迁安市"],
  8. "秦皇岛市": ["海港区", "山海关区", "北戴河区", "抚宁区", "青龙满族自治县", "昌黎县", "卢龙县", "秦皇岛市经济技术开发区", "北戴河新区"],
  9. "邯郸市": ["邯山区", "丛台区", "复兴区", "峰峰矿区", "肥乡区", "永年区", "临漳县", "成安县", "大名县", "涉县", "磁县", "邱县", "鸡泽县", "广平县", "馆陶县", "魏县", "曲周县", "邯郸经济技术开发区", "邯郸冀南新区", "武安市"],
  10. "衡水市": ["桃城区", "冀州区", "枣强县", "武邑县", "武强县", "饶阳县", "安平县", "故城县", "景县", "阜城县", "河北衡水经济开发区", "衡水滨湖新区", "深州市"]
  11. },
  12. "湖南省": {
  13. "长沙市": ["芙蓉区", "天心区", "岳麓区", "开福区", "雨花区", "望城区", "长沙县", "浏阳市", "宁乡市"],
  14. "株洲市": ["荷塘区", "芦淞区", "石峰区", "天元区", "株洲县", "攸县", "茶陵县", "炎陵县", "云龙示范区", "醴陵市"],
  15. "湘潭市": ["雨湖区", "岳塘区", "湘潭县", "湖南湘潭高新技术产业园区", "湘潭昭山示范区", "湘潭九华示范区", "湘乡市", "韶山市"],
  16. "衡阳市": ["珠晖区", "雁峰区", "石鼓区", "蒸湘区", "南岳区", "衡阳县", "衡南县", "衡山县", "衡东县", "祁东县", "衡阳综合保税区", "湖南衡阳高新技术产业园区", "湖南衡阳松木经济开发区", "耒阳市", "常宁市"],
  17. },
  18. "广东省": {
  19. "广州市": ["荔湾区", "越秀区", "海珠区", "天河区", "白云区", "黄埔区", "番禺区", "花都区", "南沙区", "从化区", "增城区"],
  20. "韶关市": ["武江区", "浈江区", "曲江区", "始兴县", "仁化县", "翁源县", "乳源瑶族自治县", "新丰县", "乐昌市", "南雄市"],
  21. "深圳市": ["罗湖区", "福田区", "南山区", "宝安区", "龙岗区", "盐田区", "龙华区", "坪山区"],
  22. "珠海市": ["香洲区", "斗门区", "金湾区"],
  23. }
  24. };

PS:实际工作的数据一般由数据库提供。如有需要也可以到网上搜索,很多大神都搜集有完整的城市数据。

准备好这些,我们按照惯例来分析功能,再一步一步完成。

1 分别获取省市县三个下拉框,如下所示:

  1. var eProvince = document.getElementById('province');
  2. var eCity = document.getElementById('city');
  3. var eCounty = document.getElementById('county');

获取到这三个下拉框后,才可以通过操作数据来修改下拉框的选项。

2 遍历数据;
页面加载后,eProvince下拉框默认就应该是有数据的,所以需要遍历数据,并取出其中的省份相关数据,生成option元素放到eProvince下拉框中,如下所示:

  1. for(let k in data){
  2. //创建option元素
  3. let eOption = document.createElement('option');
  4. //设置option元素的值为数据中“省”的名称
  5. eOption.value = k;
  6. eOption.innerHTML = k;
  7. //把option依次加入到eProvince下拉框中
  8. eProvince.appendChild(eOption);
  9. }

这时候点击省份下拉框,就可以看到下拉数据,如图所示:

3 省份下拉框绑定事件;
现在可以选择省份了,在下拉框中选择某个省,市下拉框就应该列出该省所包含的城市。所以需要给省份下拉框绑定一个change事件,如下所示:

  1. eProvince.addEventListener('change',event=>{
  2. //获取当前选择的省份值
  3. let value = eProvince.value;
  4. //修改省份后,城市和区/县下拉框中原有的值都会修改,直接通过修改eCity和eCounty元素innerHTML来初始化值
  5. eCity.innerHTML = eCounty.innerHTML = '<option value="">请选择</option>';
  6. //判断是否选择了省份
  7. if(value!=''){
  8. //在数据中遍历省份对应的城市
  9. for(let k in data[value]){
  10. //创建option元素
  11. let eOption = document.createElement('option');
  12. //设置option元素的值为数据中“城市”的名称
  13. eOption.value = k;
  14. eOption.innerHTML = k;
  15. //把option依次加入到eCity下拉框中
  16. eCity.appendChild(eOption);
  17. }
  18. }
  19. });

选择省份之后,可以看到城市下拉框中也有了该省所包含的城市数据,如图所示:

4 城市下拉框绑定事件;
现在可以选择城市了,这时候选择城市,区/县下拉框就应该列出该市对应的区/县数据,如下所示:

  1. //城市改变时,把对应的数据放到区/县下拉框中
  2. eCity.addEventListener('change',event=>{
  3. //获取已选择的省份值
  4. let sProvince = eProvince.value;
  5. //获取当前选择的城市值
  6. let sCity = eCity.value;
  7. //找到对应城市数据
  8. let arr = data[sProvince][sCity];
  9. //初始化eCounty元素中原有的值
  10. eCounty.innerHTML = '<option value="">请选择</option>';
  11. //判断是否选择的是城市名,而不是选择“请选择”
  12. if(sCity!=''){
  13. //遍历城市中对应的区/县数据
  14. for(let i=0;i<arr.length;i++){
  15. //创建option元素
  16. let eOption = document.createElement('option');
  17. //设置option元素的值为数据中“区/县”的名称
  18. eOption.value = arr[i];
  19. eOption.innerHTML = arr[i];
  20. //把option依次加入到eCounty下拉框中
  21. eCounty.appendChild(eOption);
  22. }
  23. }
  24. });

好了,到这里就完成了一个简单的省市区三级联动。选择城市后,区/县下也有对应的下拉数据,如图所示:

原生javascript制作省市区三级联动详细教程的更多相关文章

  1. 原生javascript实现省市区三级联动

    腾讯IP分享计划(http://ip.qq.com/)有个现成的三级联动功能,查看源码后发现可以直接使用其单独的JS文件(http://ip.qq.com/js/geo.js). 分析后发现自己需要写 ...

  2. 【原生js】原生js的省市区三级联动

    html: <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" c ...

  3. 【JavaScript&jQuery】省市区三级联动

    HTML: <%@page import="com.mysql.jdbc.Connection"%> <%@ page language="java&q ...

  4. 插件 原生js 省市区 三级联动 源码

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. 省市区三级联动——思路、demo、示例

    说明(2017-12-13 11:03:58): 1. 这个功能应该是注册的时候非常.常用的了,不过现在都是微信登录,手机端自动获取位置什么的,可能就网站还用用吧! 2. 这个东西的难点在于统计各地省 ...

  6. JS实现年月日三级联动+省市区三级联动+国家省市三级联动

    开篇随笔:最近项目需要用到关于年月日三级联动以及省市区三级联动下拉选择的功能,于是乎网上搜了一些做法,觉得有一些只是给出了小的案例或者只有单纯的js还不完整,却很难找到详细的具体数据(baidu搜索都 ...

  7. 项目一:第九天 1、前台客户登录 2、Jquery citypicker省市区三级联动插件 4、业务受理(在线下单)

    1. 前台客户登录 2. Jquery citypicker省市区三级联动插件 3. 百度地图介绍 4. 业务受理(在线下单) 1 实现前台系统登录功能 1.1 Md5加密 admin(明文)---- ...

  8. JS省市区三级联动

    不需要访问后台服务器端,不使用Ajax,无刷新,纯JS实现的省市区三级联动. 当省市区数据变动是只需调正js即可. 使用方法: <!DOCTYPE html><html>< ...

  9. QQ JS省市区三级联动

    如下图: 首先写一个静态的页面: <!DOCTYPE html> <html> <head> <title>QQ JS省市区三级联动</title ...

随机推荐

  1. 关于Android手机CPU不同架构的问题

    1.共有7种架构 armeabiv-v7a: 第7代及以上的 ARM 处理器.2011年15月以后的生产的大部分Android设备都使用它. arm64-v8a: 第8代.64位ARM处理器,很少设备 ...

  2. CSS知识点记录

    1.浏览器style中显示的样式 这里面的样式,是行内样式或者是使用js添加的样式

  3. 阿里云OSS生成sts令牌

    业务场景: 如果前端直接上传文件到OSS,势必要暴露令牌,无法精准控制上传内容等,使用临时令牌即可解决这个问题. 先去阿里云后台设置好token,角色,地区等 pom.xml <dependen ...

  4. Docker 安装 Redis 需要注意的地方

    Docker 安装 Redis 需要注意的地方 拉取镜像 docker pull redis 可以使用redis:xxx xxx为版本号,不写默认是latest 启动容器 无配置文件无密码: dock ...

  5. 冰点文库下载器v3.2.13绿色版

    冰点文库下载器,免费下载文档工具,无需积分也无需登陆就能自由下载百度文库.豆丁网.丁香网.电器网.MBAlib智库.爱问文档.畅享.IT168.HP009.MAX.Book118.道客巴巴.金字塔医学 ...

  6. 图的遍历BFS

    图的遍历BFS 广度优先遍历 深度优先遍历 可以进行标记 树的广度优先遍历,我们用了辅助的队列 bool visited[MAX_VERTEX_NUM] //访问标记数组 //广度优先遍历 void ...

  7. 小米k30 pro刷国际版rom

    时间:2020.8.20 最新的是miui12但是普遍反映耗电量巨大,所以还是刷miui11了. 知乎上有个教程:https://zhuanlan.zhihu.com/p/86160027 但是是针对 ...

  8. 五、testNG异常处理

    当程序出现异常或者测试中有异常测试案例可以使他抛出异常 例如:0不可以当做除数,如果将除数设置为0会抛出异常 在testNG上加上 expectedExceptions = ArithmeticExc ...

  9. css 02-CSS属性:背景属性

    02-CSS属性:背景属性 #background 的常见背景属性 css2.1 中,常见的背景属性有以下几种:(经常用到,要记住) background-color:#ff99ff; 设置元素的背景 ...

  10. antdv的Upload组件实现前端压缩图片并自定义上传功能

    Ant Design of Vue的Upload组件有几个重要的api属性: beforeUpload: 上传文件之前的钩子函数,支持返回一个Promise对象. customRequest: 覆盖组 ...