javascript利用selected属性实现省市区三级联动
来源:互联网 发布:c语言从1加到100while 编辑:程序博客网 时间:2024/06/08 14:28
javascript实现省市区三级联动
原理是根据<select>选框下<option>的selected属性来确定上一个值被选中,确定数组下标,传递给下一个数组作为循环结束值。
这是页面未进行任何操作时的原始界面。
这是点击省份下拉列表中的一个选项之后,城市与区县,均会默认选中第一个。
下面看代码:
html只定义了三个select框
省份:<select id="province" onchange="cityShow()"></select>城市:<select id="city" onchange="areaShow()"></select>区/县<select id="area"></select>
var provinceArr=["请选择省份","四川","重庆","云南"];var cityArr=[["请选择城市"], ["成都","达州","绵阳"], ["万州","沙坪坝"], ["昆明","大理","丽江"]];var areaArr=[[["请选择区域"]], [["锦江区","青羊区","金牛区","高新区"],["达县","渠县"],["绵阳市1","绵阳市2"]], [["五桥","百安"],["西永","大学城"]], [["昆明市1","昆明市2"],["洱海","苍山","下关"],["古城","玉龙县"]]];
用了三个for()嵌套循环。这里代码我都是复制粘贴,修改循环变量和节点对象。
逻辑很简单,先无脑将省份数组里的数据添加到pro下拉选框中,当选中某个省份时,能够获取到下标值,将这个下标值作为cityArr数组里的第一个索引值,此时cityArr[i] 就相当于一个一维数组了,再来循环里面的数据。
同理,取到i ,j 之后,作为areaArr的前两个索引值,再来找areaArr[i][j]里的值,即区县。
//定义全局变量var pro=document.getElementById("province");var city=document.getElementById("city");var area=document.getElementById("area");// 初始化,将省份的数组传到页面option里面for(var i=0;i<provinceArr.length;i++){//创建节点对象,创建节点的内容,将内容写入到节点对象中去,并添加到上一个父节点 var proSel=document.createElement("option"); var proTxt=document.createTextNode(provinceArr[i]); proSel.appendChild(proTxt); pro.appendChild(proSel); //将城市的数组传到页面option里面 if(pro[i].selected){ for(var j=0;j<cityArr[i].length;j++){ //创建节点对象,创建节点的内容,将内容写入到节点对象中去,并添加到上一个父节点 var citySel=document.createElement("option"); var cityTxt=document.createTextNode(cityArr[i][j]); citySel.appendChild(cityTxt); city.appendChild(citySel); //将区县的数组传到页面option里面 if(city[j].selected){ for(var k=0;k<areaArr[i][j].length;k++){ var areaSel=document.createElement("option"); var areaTxt=document.createTextNode(areaArr[i][j][k]); areaSel.appendChild(areaTxt); area.appendChild(areaSel); } } } }}
页面初始化之后,就要根据事件往里面添加数据了。
用select框的onchange事件来写。
这里有个 清空函数,最后来讲。
这一块是对province的onchange响应事件,因为我们已经选择了一个省份了,所以只要让后面的城市和区县知道我选的省份的下标就好。
//构造函数,点击province下拉列表,响应onchange事件,对city进行操作function cityShow(){//先清空上一次操作可能留下的数据 delAll("city"); delAll("area"); for(var i=0;i<pro.length;i++){ if(pro[i].selected){ for(var j=0;j<provinceArr[i].length;j++){ var citySel=document.createElement("option"); var cityTxt=document.createTextNode(cityArr[i][j]); citySel.appendChild(cityTxt); city.appendChild(citySel); //将区县的数组传到页面option里面 if(city[j].selected){ for(var k=0;k<areaArr[i][j].length;k++){ var areaSel=document.createElement("option"); var areaTxt=document.createTextNode(areaArr[i][j][k]); areaSel.appendChild(areaTxt); area.appendChild(areaSel); } } } }}}
对city的onchange事件。我们只要判断pro[i]和city[j]是否同时被选中,这样就能将i,j的值传给areaArr了,而不用往城市下拉框里去添加数据。
//构造函数,点击city下拉列表,响应onchange事件,对area进行操作function areaShow(){//先清空上一次操作可能留下的数据delAll("area");for(var i=0;i<pro.length;i++){//省份被选中的情况下,取proArr数组的下标,作为cityArr数组(二维数组)的第一个索引值if(pro[i].selected){for(var j=0;j<cityArr[i].length;j++){//省份与城市被选中的情况下,取cityArr数组(二维数组)的两个索引值,作为areaArr数组(三维数组)的第一个个索引值if(city[j].selected){for(var k=0;k<areaArr[i][j].length;k++){var areaSel=document.createElement("option"); var areaTxt=document.createTextNode(areaArr[i][j][k]); areaSel.appendChild(areaTxt); area.appendChild(areaSel);}}}}}}
做到这里其实三级联动的功能已经能实现了,但是
咦?为什么绵阳市1 2出现了两次呢?
原因就是:
我每一次选择的时候,上一次操作遗留下来的数据没有被清空,当我再点击的时候,进行循环判定之后,会再次写入到下拉框当中。
所以有必要在每次onchange操作的时候,将之前的数据全部清空,再往里面写入这次操作对应的数据。
封装一个清空子节点的函数,只需在onchange事件函数头部将city或者area传入到这里面去,就能执行清空操作,再次写入,就完全不受影响啦~
在我上面的代码里面已经添加了这句话。
function delAll(theId){ var theOb=document.getElementById(theId); var arr=theOb.childNodes; for(var j=arr.length;j>0;j--){ theOb.removeChild(arr[j-1]); }}
再来看看效果,就是图2的样子了。
虽然这种方法代码行比较多,但是逻辑较简单,代码还可以直接复制(我只写了第一个循环和添加节点和内容),后面都是copy,综上还是一个不错的适合新手的方法。
下面贴上我用jquery写的三级联动,代码量更少,操作更简单,实现的功能也更实际点击查看jquery实现三级联动
- javascript利用selected属性实现省市区三级联动
- javaScript实现省市区三级联动
- 实现省市区三级联动
- js实现省市区三级联动
- js实现省市区三级联动
- jquery实现省市区三级联动
- RecyclerView 实现省市区三级联动
- 省市区 三级联动 js 实现
- 省市区三级联动实现1
- 省市区三级联动实现2
- js实现省市区三级联动
- android省市区三级联动实现
- vue 实现省市区三级联动
- JS实现省市区三级联动
- 使用AJax和JavaScript实现省市区三级联动
- rails完美实现中国省市区三级联动
- php ajax 实现三级省市区联动
- js实现省市区三级联动select
- HTML5 Boilerplate
- petalinux(-)自动登录及启动配置
- TextView设置wrap_content时,使其宽高适应文字内容大小而不是适应background大小
- 分布式搜索elasticsearch配置文件详解
- 安卓视线可锁定首行和首列的表格视图
- javascript利用selected属性实现省市区三级联动
- tf.train.SummaryWriter()
- 多线程编程的10个例子
- css css编写三角形
- Count the string
- 【Hibernate】(二)核心对象
- VS2013配置经验
- 理解MySql
- Deep Learning读书笔记1--基础知识篇(第二、三、四、五章)