下拉列表级联菜单封装(直接拿来使用)

1 篇文章 0 订阅
1 篇文章 0 订阅


 使用说明
 

var param={
			data:subjectList,	//处理的数据(必选)数据格式:[{object Object},{object Object}] 
			showId:'levelId',//显示的数据标签ID(必选)
			idKey:'subjectId',//数据的ID(必选)
			pidKey:'parentId',//数据的父ID(必选)
			nameKey:'subjectName',//数据显示的名(必选)
			returnElement:'returnId',//返回选中的值(必选 )
			//-----------------------------------------------------
			returnIds:'returnIds',//返回所有级的ID,以“,”隔开(可选)
			initVal:209,//初始默认ID(可选)
			defName:'请选择',//默认显示的选项名(可选,如果不设置默认显示“请选择”)
			defValue:'0'//默认的选项值(可选,如果不设置默认是“0”)
		};
	ML._init(param);




(function(window,undefined){
	//父级链
	var parentNodes=new Array(),prevArr;
	window.ML ={
			_init:initMl
	};
	/**
	 * 初始化数据
	 */
	function initMl(params){
		window.params=params;
		if(!params.defName || params.defName.replace(/ /g,'').replace(/ /g,'')==''){
			params.defName='请选择';
		}
		if(!params.defValue || !(/^\d+$/.test(params.defValue))){
			params.defValue=0;
		}
		if(params.initVal && params.initVal>0){
			showmlMultilevel();
		}else{
			showRoot();
		}
	}
	/**
	 * 显示多级
	 */
	function showmlMultilevel(){
		var nodes = params.data;
		//得到初始化节点
		var node = getItself(params.initVal,nodes);
		if(node==null){
			showRoot();
			return false;
		}
		//得到初始化节点的父节点链
		parentLinkList(node,nodes);
		if(parentNodes.length>0){
			for(var i=0;i<parentNodes.length;i++){
				if(i==0){
					showRoot();
				}else{
					var arr = sameLevel(parentNodes[i],nodes);
					//创建select元素
					createSelect(arr);
				}
			}
			childList(params.initVal);
		}
	}
	
	/**
	 * 只显示根级节点
	 */
	function showRoot(){
		var rootArr = new Array();
		for(var i=0;i<params.data.length;i++){
			var _index=0;
			for(var j=0;j<params.data.length;j++){
				if(params.data[i][params.pidKey]==params.data[j][params.idKey])
				_index=1;
			}
			if(_index==0){
				rootArr.push(params.data[i]);
			}
		}
		//创建select元素
		createSelect(rootArr);
	}
	
	/**
	 * 获取初始化节点
	 */
	function getItself(initVal,nodes){
		for(var i=0;i<nodes.length;i++){
			if(initVal==nodes[i][params.idKey]){
				return nodes[i];
			}
		}
	}
	
	/**
	 * 获取父级链
	 */
	function parentLinkList(node,nodes){
		parentNodes.splice(0,0,node);
		for(var i=0;i<nodes.length;i++){
			if(node[params.pidKey]==nodes[i][params.idKey]){
				parentLinkList(nodes[i],nodes);
			}
		}
		
	}
	
	/**
	 * 获取同级节点
	 */
	function sameLevel(node,nodes){
		var sameArr =new Array();
		for(var i=0;i<nodes.length;i++){
			if(node[params.pidKey]==nodes[i][params.pidKey]){
				sameArr.push(nodes[i]);
			}
		}
		return sameArr;
	}
	
	/**
	 * 创建select元素
	 */
	function createSelect(arr){
		if(arr!=null && arr.length>0){
			var select = document.createElement('select');
			var option = document.createElement('option');
			option.setAttribute('value',params.defValue);
			var text = document.createTextNode(params.defName);
			option.appendChild(text);
			select.appendChild(option);
			for(var i=0;i<arr.length;i++){
				option = document.createElement('option');
				option.setAttribute('value',arr[i][params.idKey]);
				selected(option,arr[i]);
				text = document.createTextNode(arr[i][params.nameKey]);
				option.appendChild(text);
				select.appendChild(option);
			}
			var elem = document.getElementById(params.showId);
			elem.appendChild(select);
			select.onchange = changeSelect;
		}
	}
	/**
	 * 设置选中项
	 */
	function selected(option,node){
		if(parentNodes.length>0){
			for(var i=0;i<parentNodes.length;i++){
				if(node[params.idKey]==parentNodes[i][params.idKey]){
					option.setAttribute('selected','selected');
					break;
				}
			}
		}
	}
	/**
	 * 当选择时调用
	 */
	function changeSelect(){
		if(this.nextSibling){
			deleteNext(this.nextSibling);
		}
		prevArr =new Array();
		//获取同级前面的元素
		prevNodes(this);
		if(this.value>params.defValue){
			childList(this.value);
			document.getElementById(params.returnElement).value=this.value;
		}else{
			if(prevArr.length>0){
				if(prevArr.length>=2){
					document.getElementById(params.returnElement).value=prevArr[prevArr.length-2].value;
				}else{
					document.getElementById(params.returnElement).value=prevArr[prevArr.length-1].value;
				}
			}
		}
		if(params.returnIds){
			var ids='';
			for(var i=0;i<prevArr.length;i++){
				if(prevArr[i].value>params.defValue){
					ids+=prevArr[i].value+',';
				}
			}
			if(ids!=''){
				document.getElementById(params.returnIds).value=','+ids;
			}else{
				document.getElementById(params.returnIds).value='';
			}
			
		}
	}
	/**
	 * 获取子级节点
	 */
	function childList(thisVal){
		var childArr = new Array();
		var _data = params.data;
		for(var i=0;i<_data.length;i++){
			if(thisVal==_data[i][params.pidKey]){
				childArr.push(_data[i]);
			}
		}
		createSelect(childArr);
	}
	/**
	 * 删除当前选择的select后所所有的元素
	 */
	function deleteNext(em){
		if(em.nextSibling){
			deleteNext(em.nextSibling);
		}
		document.getElementById(params.showId).removeChild(em);
	}
	
	/**
	 * 获取前面的元素
	 */
	function prevNodes(em){
		if(em.previousSibling){
			prevNodes(em.previousSibling);
		}
		prevArr.push(em);
	}
})(window);


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值