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 相关文章推荐
javascript应用:Iframe自适应其加载的内容高度
Apr 10 Javascript
Jquery cookie操作代码
Mar 14 Javascript
将HTMLCollection/NodeList/伪数组转换成数组的实现方法
Jun 20 Javascript
图片在浏览器中底部对齐 解决方法之一
Nov 30 Javascript
js将控件隐藏及display属性的使用介绍
Dec 30 Javascript
javascript常用正则表达式汇总
Jul 31 Javascript
JS中正则表达式要注意lastIndex属性
Aug 08 Javascript
react-native 圆弧拖动进度条实现的示例代码
Apr 12 Javascript
Vue源码解析之数组变异的实现
Dec 04 Javascript
ES6知识点整理之Proxy的应用实例详解
Apr 16 Javascript
js常用正则表达式集锦
May 17 Javascript
vue 百度地图(vue-baidu-map)绘制方向箭头折线实例代码详解
Apr 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自定session保存路径及删除、注销与写入的方法
2014/11/18 PHP
php对文件夹进行相关操作(遍历、计算大小)
2015/11/04 PHP
编写PHP脚本清除WordPress头部冗余代码的方法讲解
2016/03/01 PHP
根据key删除数组中指定的元素实现方法
2017/03/02 PHP
捕获键盘事件(且兼容各浏览器)
2013/07/03 Javascript
JS操作HTML自定义属性的方法
2015/02/10 Javascript
JavaScript获取一个范围内日期的方法
2015/04/24 Javascript
jQuery焦点图插件SaySlide
2015/12/21 Javascript
如何利用JSHint减少JavaScript的错误
2016/08/23 Javascript
浅谈Node.js:fs文件系统模块
2016/12/08 Javascript
Node.js中文件操作模块File System的详细介绍
2017/01/05 Javascript
JS使用面向对象技术实现的tab选项卡效果示例
2017/02/28 Javascript
Vue实现选择城市功能
2017/05/27 Javascript
详解vue填坑之解决部分浏览器不支持pushState方法
2018/07/12 Javascript
微信小程序自定义导航栏实例代码
2019/04/05 Javascript
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
JS开发自己的类库实例分析
2019/08/28 Javascript
浅谈vuex的基本用法和mapaction传值问题
2019/11/08 Javascript
详解ES6实现类的私有变量的几种写法
2021/02/10 Javascript
Python性能优化的20条建议
2014/10/25 Python
python MySQLdb Windows下安装教程及问题解决方法
2015/05/09 Python
Python优先队列实现方法示例
2017/09/21 Python
使用实现XlsxWriter创建Excel文件并编辑
2018/05/04 Python
django 中QuerySet特性功能详解
2019/07/25 Python
wxPython电子表格功能wx.grid实例教程
2019/11/19 Python
Python pygame绘制文字制作滚动文字过程解析
2019/12/12 Python
Python chardet库识别编码原理解析
2020/02/18 Python
Django操作session 的方法
2020/03/09 Python
Pycharm中配置远程Docker运行环境的教程图解
2020/06/11 Python
家用个人磨皮机:Trophy Skin
2017/03/30 全球购物
英语商务邀请函范文
2014/01/16 职场文书
大学生咖啡店创业计划书
2014/01/21 职场文书
博士毕业生自我鉴定范文
2014/04/13 职场文书
新人入职感言
2015/07/31 职场文书
Python 读写 Matlab Mat 格式数据的操作
2021/05/19 Python
Spring中的使用@Async异步调用方法
2021/11/01 Java/Android