之前用javascript写了个三级联动,代码量较多,不够优雅简洁,这里介绍一种jquery的写法,大家可以做个比较。
还是先看效果吧。
下面是代码:
<body>
省份:<select id="province" ></select>
城市:<select id="city"></select>
区/县<select id="area"></select>
<script type="text/javascript">
var provinceArr=["四川","重庆","云南"];
var cityArr=[["成都","达州","绵阳"],
["万州","沙坪坝"],
["昆明","大理","丽江"]];
var areaArr=[[["锦江区","青羊区","金牛区","高新区"],["达县","渠县"],["绵阳市","南山"]],
[["五桥","百安"],["西永","西科"]],
[["昆明市","花城"],["洱海","苍山","下关"],["幕府","玉龙县"]]];
$().ready(function(){
//初始化省份
for(var i=0;i<provinceArr.length;i++){
$("#province").append("<option value='"+(i+1)+"'>"+provinceArr[i]+"</option>");
}
//初始化城市
$("#city").append("<option value='0'>请选择城市</option>");
for(var i=0;i<cityArr[0].length;i++){
$("#city").append("<option value='"+(i+1)+"'>"+cityArr[0][i]+"</option>");
}
//初始化区域
$("#area").append("<option value='0' >请选择区域 </option>");
for(var i=0;i<cityArr[0][0].length;i++){
$("#area").append("<option value='"+(i+1)+"'>"+areaArr[0][0][i]+"</option>");
}
//下面进行province的change事件切换设置
$("#province").change(function(){
//先清除城市 和区域里下拉列表里的所有
$("#city").empty();
$("#area").empty();
//添加一个下标为0,value为0的potion,文字为请选择城市,在省份的下拉列表被选中时候显示
$("#city").append("<option value='0'>请选择城市</option>");
//设置所选择的option的当前下标,对应的cityArr里的下标,并赋值
var proValue=$(this).val();
var curCity=cityArr[proValue-1];
for(var i=0;i<curCity.length;i++){
$("#city").append("<option value='"+(i+1)+"'>"+curCity[i]+"</option>");
}
});
//下面进行city的change事件切换设置
$("#city").change(function(){
//先清除区域里下拉列表里的所有
$("#area").empty();
//添加一个下标为0,value为0的option,文字为请选择区域,在城市的下拉列表被选中时候显示
$("#area").append("<option value='0' >请选择区域 </option>");
//获取此时province和city所对应的下标
var proValue=$("#province").val();
var cityValue=$(this).val();
var curArea=areaArr[proValue-1][cityValue-1];
for(var i=0;i<curArea.length;i++){
$("#area").append("<option value='"+(i+1)+"'>"+curArea[i]+"</option>");
}
});
});
</script>
</body>
这里的原理是利用 .append()方法向select选框下追加子节点,不需要判断父节点是否被选中,也不需要重复的用嵌套for()来追加元素内容,从而达到精简代码,减少逻辑调用的作用。
这边文章到这里其实已经可以结束了,但如果我们要自定义默认选中的城市呢。这个也简单。
我们用三个变量来存储我们的初始选择:
var p=2;
var c=1;
var a=2;
注意,在这里进行第一次省(p)的判断:
for(var i=0;i<provinceArr.length;i++){
/* 这里进行了一个判断,如果i的值与传入的value值相等,则选中value值相等的那一项 */
if(p==i+1){
$("#province").append("<option value='"+(i+1)+"' selected='selected'>"+provinceArr[i]+"</option>");
}else{
$("#province").append("<option value='"+(i+1)+"'>"+provinceArr[i]+"</option>");
}
}
同理,对城市(c)和区县(a)进行判断,选择
//初始化城市
$("#city").append("<option value='0'>请选择城市</option>");
for(var i=0;i<cityArr[p-1].length;i++){
if(c==i+1){
$("#city").append("<option value='"+(i+1)+"' selected='selected'>"+cityArr[p-1][i]+"</option>");
}else{
$("#city").append("<option value='"+(i+1)+"'>"+cityArr[p-1][i]+"</option>");
}
}
//初始化区域
$("#area").append("<option value='0' >请选择区域 </option>");
for(var i=0;i<cityArr[p-1][c-1].length;i++){
if(a==i+1){
$("#area").append("<option value='"+(i+1)+"' selected='selected'>"+areaArr[p-1][c-1][i]+"</option>");
}else{
$("#area").append("<option value='"+(i+1)+"'>"+areaArr[p-1][c-1][i]+"</option>");
}
}
其他地方不需改动,我们现在再来看看效果,根据p、c、a的值和数组里对比,页面应该默认选中
重庆—万州—百安
网页上是什么呢
验证自定义成功。
那这样的修改有何意义呢。
当我们在某些网站填写个人地址时,第一次是由我们自己选择,这时系统已经把我操作的数据存入数据库了。当我下次进行数据修改时,系统默认地址显示的就是我上次存入的数据,原理就是我上面的操作(不过我目前道行不够,还未进行数据库操作~~)。
到此这篇文章正式结束啦~
谢谢各位大佬点击~~