jquery+json 通用三级联动下拉列表


Posted in Javascript onApril 19, 2010

Author: shaoyun
Email: shaoyun (at) yeah.net
Date: 2010-03-10 02:03
Blog: http://shaoyun.cnblogs.com/

用Jquery实现,原始代码只支持IE,这里我改了一下,我的代码里面有三个版本的实现
第一个是通过读取XML构建,支持IE/firefox,chrome不支持,有兴趣的可以将读取XML的部分改成AJAX的方式,这样chrome支持就不成问题
第二个是采用Json数据格式构建,是我的第二次尝试改进
第三个与第二个其实是一样的,只不过将数据分离到JS文件中,我的代码中有一个ASP文件,是调用数据库生成Json省市区数据的,如果页面直接调用ASP文件,速度会很慢,生成JS文件后直接调用就要快的多,而且这部分数据一般不会改动

更新记录:

++2010-04-19 12:11:24
多加了一个插件的例子,其实不算插件,就是一函数,为什么不写成插件,只是基于灵活性的考虑,
让select可以放在页面的任何位置,而不是局限在div、table、td等页面元素内
参数类似下面,s1/s2/s3配置select的id,v1/v2/v3为默认值,如果不想设置请设置为null,或者直接不设置

参数配置如下,配置select的三个ID和默认值就行,无默认值填写为null

var defaults = { 
s1:'Select1', 
s2:'Select2', 
s3:'Select3', 
v1:null, 
v2:null, 
v3:null 
};

这算是第四个例子,目录下的php文件是服务端数据的生成Demo,用作使用的参考

数据格式定义类似如下:

var threeSelectData={ 
"省份":{val:"",items:{"城市":{val:"",items:{"区县":""}}}}, 
"beijing":{val:"01",items:{ 
"bj-01":{val:"0101",items:{ 
"bj-01-01":"010101" 
}}, 
"bj-02":{val:"0102",items:{ 
"bj-02-01":"010201", 
"bj-02-02":"010202" 
}} 
}}, 
"shanxi":{val:"02",items:{}}, 
"guangzhou":{val:"02",items:{}} 
};

代码例子:

<script type="text/javascript" src="../jquery-1.3.2.min.js"></script> 
<script type="text/javascript" src="areadata.js"></script> 
<script type="text/javascript"> 
/* 
通用三级联动说明 
参数配置如下,配置select的三个ID和默认值就行,无默认值填写为null 
var defaults = { 
s1:'Select1', 
s2:'Select2', 
s3:'Select3', 
v1:null, 
v2:null, 
v3:null 
}; 
*/ 
var defaults = { 
s1:'Select1', 
s2:'Select2', 
s3:'Select3', 
v1:120000, 
v2:120200, 
v3:120224 
}; 
$(function(){ 
threeSelect(defaults); 
}); 
function threeSelect(config){ 
var $s1=$("#"+config.s1); 
var $s2=$("#"+config.s2); 
var $s3=$("#"+config.s3); 
var v1=config.v1?config.v1:null; 
var v2=config.v2?config.v2:null; 
var v3=config.v3?config.v3:null; 
$.each(threeSelectData,function(k,v){ 
appendOptionTo($s1,k,v.val,v1); 
}); 
$s1.change(function(){ 
$s2.html(""); 
$s3.html(""); 
if(this.selectedIndex==-1) return; 
var s1_curr_val = this.options[this.selectedIndex].value; 
$.each(threeSelectData,function(k,v){ 
if(s1_curr_val==v.val){ 
if(v.items){ 
$.each(v.items,function(k,v){ 
appendOptionTo($s2,k,v.val,v2); 
}); 
} 
} 
}); 
if($s2[0].options.length==0){appendOptionTo($s2,"...","",v2);} 
$s2.change(); 
}).change(); 
$s2.change(function(){ 
$s3.html(""); 
var s1_curr_val = $s1[0].options[$s1[0].selectedIndex].value; 
if(this.selectedIndex==-1) return; 
var s2_curr_val = this.options[this.selectedIndex].value; 
$.each(threeSelectData,function(k,v){ 
if(s1_curr_val==v.val){ 
if(v.items){ 
$.each(v.items,function(k,v){ 
if(s2_curr_val==v.val){ 
$.each(v.items,function(k,v){ 
appendOptionTo($s3,k,v,v3); 
}); 
} 
}); 
if($s3[0].options.length==0){appendOptionTo($s3,"...","",v3);} 
} 
} 
}); 
}).change(); 
function appendOptionTo($o,k,v,d){ 
var $opt=$("<option>").text(k).val(v); 
if(v==d){$opt.attr("selected", "selected")} 
$opt.appendTo($o); 
} 
} 
</script> 
<style type="text/css" media="screen"> 
select{width:80px;} 
</style> 
<select id="Select1" name="Select1"></select> 
<select id="Select2" name="Select2"></select> 
<select id="Select3" name="Select3"></select>

文字没有详细整理!懂点JS的就能看懂!

代码打包下载

Javascript 相关文章推荐
JS模拟多线程
Feb 07 Javascript
js仿百度有啊通栏展示效果实现代码
May 28 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
Aug 30 Javascript
js实现页面跳转重定向的几种方式
May 29 Javascript
javascript实现仿腾讯游戏选择
May 14 Javascript
JavaScript中闭包的写法和作用详解
Jun 29 Javascript
layui弹出层效果实现代码
May 19 Javascript
Angular 2.x学习教程之结构指令详解
May 25 Javascript
Javascript的console['']常用输入方法汇总
Apr 26 Javascript
vue cli 3.0 使用全过程解析
Jun 14 Javascript
Nginx设置为Node.js的前端服务器方法总结
Mar 27 Javascript
JavaScript最完整的深浅拷贝实现方式详解
Feb 28 Javascript
javascript中的变量是传值还是传址的?
Apr 19 #Javascript
js获取当前select 元素值的代码
Apr 19 #Javascript
监控 url fragment变化的js代码
Apr 19 #Javascript
jquery获取input表单值的代码
Apr 19 #Javascript
编写高性能的JavaScript 脚本的加载与执行
Apr 19 #Javascript
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
Apr 18 #Javascript
jquery 新手学习常见问题解决方法
Apr 18 #Javascript
You might like
php date()日期时间函数详解
2010/05/16 PHP
批量获取memcache值并按key的顺序返回的实现代码
2011/06/14 PHP
Chrome Web App开发小结
2014/09/04 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
2020/08/17 PHP
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
javascript 系统文件夹文件操作及参数介绍
2013/01/08 Javascript
让复选框只能选择一项的方法
2013/10/08 Javascript
js跑步算法的实现代码
2013/12/04 Javascript
js实现超酷的照片墙展示效果图附源码下载
2015/10/08 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
理解JavaScript事件对象
2016/01/25 Javascript
Bootstrap3 多个模态对话框无法显示的解决方案
2017/02/23 Javascript
细说webpack源码之compile流程-rules参数处理技巧(2)
2017/12/26 Javascript
详解关于element el-button使用$attrs的一个注意要点
2018/11/09 Javascript
vue+axios全局添加请求头和参数操作
2020/07/24 Javascript
Vue 根据条件判断van-tab的显示方式
2020/08/03 Javascript
[52:02]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第二场 2月26日
2021/03/11 DOTA
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
深入理解python中的atexit模块
2017/03/07 Python
基于python 字符编码的理解
2017/09/02 Python
python中将两组数据放在一起按照某一固定顺序shuffle的实例
2019/07/15 Python
Django实现简单网页弹出警告代码
2019/11/15 Python
基于python实现获取网页图片过程解析
2020/05/11 Python
如何验证python安装成功
2020/07/06 Python
HTML5 Canvas实现烟花绽放特效
2016/03/02 HTML / CSS
html table呈现个人简历以及单元格宽度失效的问题解决
2021/01/22 HTML / CSS
小米官方旗舰店:Xiaomi
2020/08/07 全球购物
怎样声明接口
2014/09/19 面试题
学生会招新策划书
2014/02/14 职场文书
家长对学生的评语
2014/04/18 职场文书
承诺书格式范文
2014/06/03 职场文书
2015年保洁工作总结范文
2015/04/28 职场文书
党员干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
使用 JavaScript 制作页面效果
2021/04/21 Javascript
react合成事件与原生事件的相关理解
2021/05/13 Javascript
Python标准库之typing的用法(类型标注)
2021/06/02 Python