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 相关文章推荐
基于jsTree的无限级树JSON数据的转换代码
Jul 27 Javascript
onsubmit阻止form表单提交与onclick的相关操作
Sep 03 Javascript
js 判断checkbox是否选中的操作方法
Nov 09 Javascript
Document.location.href和.replace的区别示例介绍
Mar 04 Javascript
使用纯javascript实现放大镜效果
Mar 18 Javascript
JQuery中DOM事件绑定用法详解
Jun 13 Javascript
浅谈如何使用 webpack 优化资源
Oct 20 Javascript
Vue中使用vee-validate表单验证的方法
May 09 Javascript
判断iOS、Android以及PC端的示例代码
Nov 15 Javascript
vue实现div拖拽互换位置
Jul 29 Javascript
JavaScript数组去重的方法总结【12种方法,号称史上最全】
Feb 28 Javascript
使用vuex解决刷新页面state数据消失的问题记录
May 08 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笔试题
2009/08/04 PHP
php检测useragent版本示例
2014/03/24 PHP
php取得字符串首字母的方法
2015/03/25 PHP
PHP实现从PostgreSQL数据库检索数据分页显示及根据条件查找数据示例
2018/06/09 PHP
js 省地市级联选择
2010/02/07 Javascript
JavaScript/jQuery 表单美化插件小结
2012/02/14 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
2013/06/02 Javascript
SwfUpload在IE10上不出现上传按钮的解决方法
2013/06/25 Javascript
更快的异步执行(setTimeout多浏览器)
2014/08/12 Javascript
AngularJS ng-template寄宿方式用法分析
2016/11/07 Javascript
JavaScript实现提交模式窗口后刷新父窗口数据的方法
2017/06/16 Javascript
vuex操作state对象的实例代码
2018/04/25 Javascript
使用rollup打包JS的方法步骤
2018/12/05 Javascript
JavaScript中this用法学习笔记
2019/03/17 Javascript
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
p5.js实现动态图形临摹
2019/10/23 Javascript
Vue如何将页面导出成PDF文件
2020/08/17 Javascript
[01:11:48]Fnatic vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[01:13:18]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
python列表操作使用示例分享
2014/02/21 Python
Pipenv一键搭建python虚拟环境的方法
2018/05/22 Python
python random从集合中随机选择元素的方法
2019/01/23 Python
解决python测试opencv时imread导致的错误问题
2019/01/26 Python
十个Python练手的实战项目,学会这些Python就基本没问题了(推荐)
2019/04/26 Python
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
Bootstrap File Input文件上传组件
2020/12/01 HTML / CSS
美津浓美国官网:Mizuno美国
2018/08/07 全球购物
建龙钢铁面试总结
2014/04/15 面试题
历史学专业推荐信
2013/11/06 职场文书
群众路线教育实践活动整改方案(个人版)
2014/10/25 职场文书
2014年辅导员工作总结
2014/11/18 职场文书
超市食品安全承诺书
2015/04/29 职场文书
Apache压力测试工具的安装使用
2021/03/31 Servers
Nginx服务器如何设置url链接
2021/03/31 Servers
【海涛dota解说】DCG联赛第一周 LGD VS DH
2022/04/01 DOTA