以jquery插件形式获取json数据实现级联

最近学了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"
            }]
        }]
    }
]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值