最近学了jquery,然后就写了个级联的插件来练手,特在此分享交流,新手开发,若有不足,还望指教。
思路:要实现级联,我的思路是将要展现的各级级联元素获取,然后分级遍历,append到对应级联框中。
实现:
1.首先写个html,引入jquery库文件,和自己写的插件
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>级联</title>
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="jquery.cascade.js"></script>
</head>
<body>
<!--要展现级联的div框-->
<div id="a"></div>
</body>
</html>
2.编写插件jquery.cascade.js如下
(function($){
$.fn.cascade=function(opt){//opt即option
var opts=$.extend({//设置默认参数,参数可选择性覆盖
url:"address.json",
firstName:"学院",//一级框前面的文字
secondName:"专业",
thirdName:"班级",
firstText:"请选择学院",//一级框里默认的选项
secondText:"请选择专业",
thirdText:"请选择班级",
attrName:"name",
attrValue:"id"
},opt||{});
//定义一个变量指向this
var target=this;
//级联中的html中select的初始化,将对象缓存,便于后面遍历
opts.one=$("<select id='first_select'><option>"+opts.firstText+"</option></select>");//一级框
opts.two=$("<select id='second_select'><option>"+opts.secondText+"</option></select>");//二级框
opts.three=$("<select id='third_select'><option>"+opts.thirdText+"</option></select>");//三级框
//通过ajax加载文件
$.getJSON(opts.url,function(data){
$.each(data,function(index,value){//一级遍历添加
opts.one.append(createNode(this));
});
opts.one.change(function(){
//清除二三级级联框以前的内容
opts.two.find("option:gt(0)").remove();
opts.three.find("option:gt(0)").remove();
var str=$(this).val();//保存要选择的元素的值
var child=findChildren(data,str);//获取二级元素
$(child).each(function(index, element) {//二级遍历
opts.two.append(createNode(this));
});
});
opts.two.change(function(){
//清除三级级联框以前的内容
opts.three.find("option:gt(0)").remove();
var parentStr=$("#first_select").val();//一级框的当前值
var str=$(this).val();//保存要选择的元素的值
var child=findChildren(data,parentStr);//获取二级元素
var grandson=findChildren(child,str);//获取三级元素
$(grandson).each(function(index, element) {//遍历三级框内容
opts.three.append(createNode(this));
});
});
target.append(opts.firstName+": ");//第一个select前的文本
target.append(opts.one);
target.append(" "+opts.secondName+": ");//第二个
target.append(opts.two);
target.append(" "+opts.thirdName+": ");//第三个
target.append(opts.three);
});
function findChildren(arr,str){ //寻找子元素
var child;
$.each(arr,function(index,value){
if(arr[index].id==str){
child=arr[index].children;
}
})
return child;
}
function createNode(obj){//创建节点<option>
return "<option value='"+obj[opts.attrValue]+"'>"+obj[opts.attrName]+"</option>";
}
}
})(jQuery)
3.方法调用
//$("#a").cascade();//可以直接调用实现级联
//也可以传参覆盖
$("#a").cascade({
url:"address.json",
firstName:"所属学院",
secondName:"就读专业",
thirdName:"所在班级",
firstText:"请选择学院",
secondText:"请选择专业",
thirdText:"请选择班级"
});
4.用到的测试数据在address.json里
[
{
"id":"01",
"name":"通信学院",
"children":[{
"id":"0111",
"name":"通信工程",
"children":[{
"id":"0111101",
"name":"0111101"
},{
"id":"0111102",
"name":"0111102"
}]
},{
"id":"0121",
"name":"电子信息工程",
"children":[{
"id":"0121101",
"name":"0111101"
},{
"id":"0121102",
"name":"0121102"
}]
}]
},{
"id":"03",
"name":"经济管理学院",
"children":[{
"id":"0311",
"name":"信息管理与信息系统",
"children":[{
"id":"0311201",
"name":"0311201"
},{
"id":"0311202",
"name":"0311202"
},{
"id":"0311203",
"name":"0311203"
}]
},{
"id":"0381",
"name":"工商管理",
"children":[{
"id":"0381201",
"name":"0381201"
},{
"id":"0381202",
"name":"0381202"
}]
}]
}
]