js实现省级联动(数据结构优化)


Posted in Javascript onJuly 17, 2020

本文实例为大家分享了js实现省级联动的具体代码,供大家参考,具体内容如下

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Document</title>
 <style>
  div{
   width: 200px;
   float: left;
   margin-left: 20px;
  }
  select{
   width: 200px;
  }
 </style>
</head>
<body>
 
 <div>
  <select id="province" name="province">
   <option value="">---请选择省---</option>
  </select>
 </div>
 <div>
  <select id="city" name="city">
   <option value="">---请选择城市---</option>
  </select>
 </div>
</body>
<script>
 //准备数据---
 let data = [
  {
   p_name:"浙江省",
   p_id:1,
   citys:[
    {
     c_name:"杭州市",
     c_id:100
    },
    {
     c_name:"温州市",
     c_id:101
    },
    {
     c_name:"宁波市",
     c_id:102
    },
    {
     c_name:"嘉兴市",
     c_id:103
    },
    {
     c_name:"湖州市",
     c_id:104
    },
    {
     c_name:"绍兴市",
     c_id:105
    },
    {
     c_name:"金华市",
     c_id:106
    },
   ]
  },
  {
   p_name:"湖北省",
   p_id:2,
   citys:[
    {
     c_name:"武汉市",
     c_id:200
    },
    {
     c_name:"黄石市",
     c_id:201
    },
    {
     c_name:"十堰市",
     c_id:202
    },
    {
     c_name:"襄阳市",
     c_id:204
    },
    {
     c_name:"荆州市",
     c_id:205
    },
    {
     c_name:"黄冈市",
     c_id:206
    },
   ]
  },
  {
   p_name:"山东省",
   p_id:3,
   citys:[
    {
     c_name:"济南市",
     c_id:300
    },
    {
     c_name:"青岛市",
     c_id:301
    },
    {
     c_name:"淄博市",
     c_id:302
    },
    {
     c_name:"枣庄市",
     c_id:303
    },
    {
     c_name:"烟台市",
     c_id:304
    },
    {
     c_name:"日照市",
     c_id:305
    },
   ]
  }
 ];

 // 加载所有的省份信息到一级的下拉列表中
 let province = document.getElementById("province");
 data.forEach((e,i)=>{
  province.innerHTML += '<option value="'+e.p_id+'">'+e.p_name+'</option>'
 });
 //给一级下拉列表绑定onchange事件
 province.onchange = function(){
  // this.value;//选择的省的id
  // alert(this.value);
  //根据省的id去找该省对应的市的信息

  data.forEach((e,i)=>{
   if(e.p_id == this.value){
    let citys = e.citys;
    //将所有的市的信息填充到二级的下拉列表
    let city = document.getElementById("city");

    //把之前的所有选项清掉
    city.innerHTML = '<option value="">---请选择城市---</option>'
    citys.forEach((ele,idx)=>{
     //ele.c_name;//市的名称
     // ele.c_id;//市的id
     city.innerHTML += '<option value="'+ele.c_id+'">'+ele.c_name+'</option>'
    });
   }
 });
 }

</script>
</html>

具体实现如下,发现城市数据存的很深,要通过省来查找城市会比较麻烦,而且循环遍历的是指数级的占内存,通过下面数据结构的优化,相对而言,查询会更容易
实现大概的思路是通过map集合,key找value的思路
存入的时候省,单独放。城市的key等于省的p_id,因为有了标识,这样就很容易相互查询了

//准备数据---
 <!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>快速入门</title>
</head>
<body>
 <div>
  <select id="province" name="province">
   <option value="">---请选择省---</option>
  </select>
 </div>
 <div>
  <select id="city" name="city" >
   <option value="">---请选择城市---</option>
  </select>
 </div>
</body>
<script src="js/jquery-3.3.1.min.js"></script>
<script>
 
 let data = [
  {
   p_name:"浙江省",
   p_id:1,
  },
  {
   p_name:"湖北省",
   p_id:2,
  },
 ];

 let city={1:[ { 
     c_name:"杭州市",
     c_id:100
    },
    {
     c_name:"温州市",
     c_id:101
    },
    {
     c_name:"宁波市",
     c_id:102
    },
    {
     c_name:"嘉兴市",
     c_id:103
    },
    {
     c_name:"湖州市",
     c_id:104
    },
    {
     c_name:"绍兴市",
     c_id:105
    },
    {
     c_name:"金华市",
     c_id:106
    },
 ],
 2:[ {
     c_name:"武汉市",
     c_id:200
    },
    {
     c_name:"黄石市",
     c_id:201
    },
    {
     c_name:"十堰市",
     c_id:202
    },
    {
     c_name:"襄阳市",
     c_id:204
    },
    {
     c_name:"荆州市",
     c_id:205
    },
    {
     c_name:"黄冈市",
     c_id:206
    },
 ]
   }

 
 data.forEach((e,i)=>{
  $("#province").append('<option value="'+e.p_id+'">'+e.p_name+'</option>')
 })

 $("#province").change(function(){
 $("#city").empty();
 let num= this.value;
  city[num].forEach((e,i)=>{
   $("#city").append('<option value="'+e.c_id+'">'+e.c_name+'</option>')
  })
 })
 
 
</script>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Jquery刷新页面背景图片随机变换的实现方法
Mar 15 Javascript
JS幻灯片可循环播放可平滑旋转带滚动导航(自写)
Aug 05 Javascript
网页广告中JS代码的信息监听示例
Apr 02 Javascript
JS实现密码框根据焦点的获取与失去控制文字的消失与显示效果
Nov 26 Javascript
浅谈js中子页面父页面方法 变量相互调用
Aug 04 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
Jan 24 Javascript
浅谈Node.js 中间件模式
Jun 12 Javascript
微信小程序的tab选项卡的实现效果
May 15 Javascript
Javascript数组方法reduce的妙用之处分享
Jun 10 Javascript
Vue中实现回车键切换焦点的方法
Feb 19 Javascript
javascript设计模式 ? 工厂模式原理与应用实例分析
Apr 09 Javascript
基于js判断浏览器是否支持webGL
Apr 18 Javascript
Vue如何基于vue-i18n实现多国语言兼容
Jul 17 #Javascript
jquery实现有过渡效果的tab切换
Jul 17 #jQuery
使用Vue-cli 中为单独页面设置背景图片铺满全屏
Jul 17 #Javascript
vue 点击其他区域关闭自定义div操作
Jul 17 #Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
Jul 17 #Javascript
利用Vue的v-for和v-bind实现列表颜色切换
Jul 17 #Javascript
基于js实现判断浏览器类型代码实例
Jul 17 #Javascript
You might like
PHP循环获取GET和POST值的代码
2008/04/09 PHP
php模拟ping命令(php exec函数的使用方法)
2013/10/25 PHP
php截取字符串函数分享
2015/02/02 PHP
PHP概率计算函数汇总
2015/09/13 PHP
javascript控制swfObject应用介绍
2012/11/29 Javascript
JavaScript中的eval()函数详解
2013/08/22 Javascript
深入理解JavaScript中的对象
2015/06/04 Javascript
JS实现放大、缩小及拖拽图片的方法【可兼容IE、火狐】
2016/08/23 Javascript
JavaScript自定义函数实现查找两个字符串最长公共子串的方法
2016/11/24 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
浅谈ES6 模板字符串的具体使用方法
2017/11/07 Javascript
javascript的惯性运动实现代码实例
2019/09/07 Javascript
vue-cli 为项目设置别名的方法
2019/10/15 Javascript
python中django框架通过正则搜索页面上email地址的方法
2015/03/21 Python
在Python中使用mechanize模块模拟浏览器功能
2015/05/05 Python
python列表操作之extend和append的区别实例分析
2015/07/28 Python
python&amp;MongoDB爬取图书馆借阅记录
2016/02/05 Python
Python判断telnet通不通的实例
2019/01/26 Python
Python 实现try重新执行
2019/12/21 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
2020/04/08 Python
Python ellipsis 的用法详解
2020/11/20 Python
CSS3实现瀑布流布局与无限加载图片相册的实例代码
2016/12/22 HTML / CSS
HTML5中的拖放实现详解
2017/08/23 HTML / CSS
日本著名的服饰鞋帽综合类购物网站:MAGASEEK
2019/01/09 全球购物
个人找工作的自我评价
2013/10/17 职场文书
女子职高个人自荐书
2014/02/01 职场文书
20年同学聚会感言
2014/02/03 职场文书
模特职业生涯规划范文
2014/02/26 职场文书
校园安全演讲稿
2014/05/09 职场文书
三年级学生期末评语
2014/12/26 职场文书
在职证明书模板
2015/06/15 职场文书
KTV员工管理制度
2015/08/06 职场文书
CSS预处理框架——Stylus
2021/04/21 HTML / CSS
Django使用echarts进行可视化展示的实践
2021/06/10 Python
简单总结SpringMVC拦截器的使用方法
2021/06/28 Java/Android
vue使用echarts实现折线图
2022/03/21 Vue.js