基于layui的。
关键的js代码
/* * 扩展一个treeSelect模块,联动Select组件 * * */ layui.define(['form','jquery'],function(exports) { //提示:模块也可以依赖其它模块,如:layui.define('layer', callback); "use strict"; var $ = layui.$; var layuiTreeSelectCalss="layui-treeSelect"; var getSelectDiv=function(nodes,id,layFilter,value){ var div="<div class='layui-input-inline "+layuiTreeSelectCalss+"' style='width:120px' id='"+id+"'>"; div+="<select lay-filter='"+layFilter+"'>"; div+="<option value=''>---请选择---</option>"; for(var i=0;i<nodes.length;i++){ if(value){ div+="<option value='"+nodes[i].id+"' "+(nodes[i].id==value?'selected':'')+" >"+nodes[i].name+"</option>"; }else{ div+="<option value='"+nodes[i].id+"' "+""+" >"+nodes[i].name+"</option>"; } } div+="</select>"; div+="</div>"; return div; } var initTreeSelect=function(nodes,container,value){ var eleId=new Date().getTime()+""+parseInt(1000*Math.random()); var layFilter=eleId+"_layFilter"; var selectHtml=getSelectDiv(nodes,eleId,layFilter,value); $(container).append(selectHtml); layui.form.render(); layui.form.on('select('+layFilter+')', function(data){ //显示删除当前节点后面的节点 $("#"+eleId).nextAll("div."+layuiTreeSelectCalss).remove(); for(var i=0;i<nodes.length;i++){ if(nodes[i].id==data.value){ var children=nodes[i].children; if(children&&children.length>0){ initTreeSelect(children,container); } break; } } }); } var treeSelect={ getSingleData:function(nodes,data,tempData){ //外部用不到,用于内部递归 if(nodes==undefined||nodes.length==0){ return false; } for(var i=0;i<nodes.length;i++){ if(nodes[i].id==data){ tempData.push(nodes[i].id); return true; }else{ tempData.push(nodes[i].id); if(this.getSingleData(nodes[i].children,data,tempData)){ return true; }; } tempData.pop(); } }, setSelect:function(nodes,container,data){ //外部用不到,用于内部递归 if(data.length>0){ for(var i=0;i<nodes.length;i++){ if(nodes[i].id==data[0]){ initTreeSelect(nodes,container,data[0]); nodes=nodes[i].children; if(data.length>1){ data.shift(); this.setSelect(nodes,container,data); break; } } } } }, init:function(container,param){//初始化组件,目前param,nodes(树形JSON),data设置组件的值 if(!this.cacheData){ this.cacheData={}; } this.cacheData[container]={}; this.cacheData[container].nodes=param.nodes; $(container).find("div."+layuiTreeSelectCalss).remove(); initTreeSelect(this.cacheData[container].nodes,container); if(param.data){ this.setValue(container,param.data); } }, setValue:function(container,data){//设置组件的值,data可以为string和数组,如果是string,则认为最后以及的值,反向推算。如果是数组,则按照数组进行赋值 var nodes=this.cacheData[container].nodes; if(typeof data=='string'){ //如果是string,那么说明传的是最后一个值,从nodes中找出对应的数组 var tempData=[]; for(var i=0;i<nodes.length;i++){ if(nodes[i].id==data){ tempData.push(nodes[i].id); break; }else{ tempData.push(nodes[i].id); if(this.getSingleData(nodes[i].children,data,tempData)){ break; } } tempData.pop(); } data=tempData; } $(container).find("div."+layuiTreeSelectCalss).remove(); this.setSelect(nodes,container,data); }, getTreeData:function(container){//获取当前组件的所有数据 return this.cacheData[container].nodes; }, getData:function(container){//获取当前组件的值,是个数组 var data=[]; $(container).find("div."+layuiTreeSelectCalss).find("select").each(function(){ data.push($(this).val()); }); return data; }, }; //输出treeSelect接口 exports('treeSelect', treeSelect); });
还是老规矩,直接上例子链接吧。
http://blog.jvbaopeng.com/demo/tree.html
转帖于:http://fly.layui.com/jie/14421/