《layui从鱼到渔》-无限级联动下拉框
编辑时间:2017-12-19 作者:金满斗 浏览量:2649 来源:layui论坛亚马逊原创

基于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/


来说两句吧