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入门基础 document.write输出
Feb 22 Javascript
jquery监控数据是否变化(修正版)
Apr 12 Javascript
dotopAlert 提示用户需安装播放器的代码
Sep 17 Javascript
js关于字符长度限制的问题示例探讨
Jan 24 Javascript
Javascript写入txt和读取txt文件示例
Feb 12 Javascript
JavaScript检测鼠标移动方向的方法
May 22 Javascript
详解jQuery中的deferred对象的使用(一)
May 27 Javascript
jQuery筛选数组之grep、each、inArray、map的用法及遍历json对象
Jun 20 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
Aug 24 Javascript
jQuery Datatables表头不对齐的解决办法
Nov 27 jQuery
VUE组件中的 Drawer 抽屉实现代码
Aug 06 Javascript
Element Input输入框的使用方法
Jul 26 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
怎么样可以把 phpinfo()屏蔽掉?
2006/11/24 PHP
PHP has encountered an Access Violation
2007/01/15 PHP
smarty中post用法实例
2014/11/28 PHP
jquery不支持toggle()高(新)版本的问题解决
2016/09/24 PHP
Laravel框架学习笔记之批量更新数据功能
2019/05/30 PHP
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
2013/06/26 Javascript
js实现上传图片预览方法
2016/10/25 Javascript
Javascript中字符串replace方法的第二个参数探究
2016/12/05 Javascript
vuejs指令详解
2017/02/07 Javascript
深入理解vue2.0路由如何配置问题
2017/07/18 Javascript
超级简易的JS计算器实例讲解(实现加减乘除)
2017/08/08 Javascript
利用vue + element实现表格分页和前端搜索的方法
2017/12/25 Javascript
浅谈Node.js 沙箱环境
2018/05/15 Javascript
vue2.0的虚拟DOM渲染思路分析
2018/08/09 Javascript
详解vue文件中使用echarts.js的两种方式
2018/10/18 Javascript
vue的for循环使用方法
2019/02/12 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
2019/08/29 Javascript
vue.js实现h5机器人聊天(测试版)
2020/07/16 Javascript
js实现跳一跳小游戏
2020/07/31 Javascript
举例详解Python中yield生成器的用法
2015/08/05 Python
python爬虫基本知识
2018/03/05 Python
Python多重继承的方法解析执行顺序实例分析
2018/05/26 Python
python消费kafka数据批量插入到es的方法
2018/12/27 Python
Django实现分页显示效果
2019/10/31 Python
深入了解Python 方法之类方法 &amp; 静态方法
2020/08/17 Python
天网面试题
2013/04/07 面试题
国际贸易专业推荐信
2013/11/15 职场文书
银行竞聘演讲稿范文
2014/04/23 职场文书
市级绿色学校申报材料
2014/08/25 职场文书
三好学生先进事迹材料
2014/08/28 职场文书
领导班子作风建设年个人整改措施
2014/09/29 职场文书
学校食堂管理制度
2015/08/04 职场文书
2016年中学端午节主题活动总结
2016/04/01 职场文书
Python Django ORM连表正反操作技巧
2021/06/13 Python
python自动化八大定位元素讲解
2021/07/09 Python
如何通过一篇文章了解Python中的生成器
2022/04/02 Python