| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 | /** @version: 2.0* @Author:  tomato* @Date:    2018-5-5 11:29:57* @Last Modified by:   tomato* @Last Modified time: 2018-5-26 18:08:43*///多选下拉框layui.define(['jquery', 'layer'], function(exports){	var MOD_NAME = 'selectM';	var $ = layui.jquery,layer=layui.layer;	var obj = function(config){		this.disabledIndex =[];		//当前选中的值名数据		this.selected = [];		//当前选中的值		this.values =[];		//当前选中的名称		this.names =[];				//初始化设置参数		this.config = {			//选择器id或class			elem: '',			//候选项数据[{id:"1",name:"名称1",status:0},{id:"2",name:"名称2",status:1}]			data: [],							//默认选中值			selected: [],			//空值项提示,支持将{max}替换为max						tips: '请选择 最多 {max} 个',							//最多选中个数,默认5			max : 5,						//选择框宽度			width:null,						//值验证,与lay-verify一致			verify: '',				//input的name 不设置与选择器相同(去#.)			name: '',						//值的分隔符			delimiter: ',',						//候选项数据的键名 status=0为禁用状态			field: {idName:'id',titleName:'name',statusName:'status'}		}		this.config = $.extend(this.config,config);		//创建选项元素		this.createOption = function(){				var o=this,c=o.config,f=c.field,d = c.data;				var s = c.selected;				$E = $(c.elem);				var tips = c.tips.replace('{max}',c.max);				var inputName = c.name=='' ? c.elem.replace('#','').replace('.','') : c.name;				var verify = c.verify=='' ? '' : 'lay-verify="'+c.verify+'" ';				var html = '';				html +=	'<div class="layui-unselect layui-form-select">';				html +=			'<div class="layui-select-title">';				html +=				'<input '+verify+'name="'+inputName+'" type="text" readonly="" class="layui-input layui-unselect">';				html +=			'</div>';				html +=			'<div class="layui-input multiple">';				html +=			'</div>';				html +=			'<dl class="layui-anim layui-anim-upbit">';				html +=				'<dd lay-value="" class="layui-select-tips">'+tips+'</dd>';				for(var i=0;i<d.length;i++){					var disabled1='',disabled2='';					if(d[i][f.statusName]==0){						o.disabledIndex[d[i][f.idName]] = d[i][f.titleName];						disabled1 = d[i][f.statusName]==0 ? 'layui-disabled' : '';						disabled2 = d[i][f.statusName]==0 ? ' layui-checkbox-disbaled layui-disabled' : '';											}					html +='<dd lay-value="'+d[i][f.idName]+'" class="'+disabled1+'">';					html +=		'<div class="layui-unselect layui-form-checkbox'+disabled2+'" lay-skin="primary">';					html +=			'<span>'+d[i][f.titleName]+'</span><i class="layui-icon"></i>';					html +=		'</div>';					html +='</dd>';				}				html +=			'</dl>';				html +=		'</div>';								$E.html(html);		}		//设置选中值		this.set = function(selected){			var o=this,c=o.config;			var s = typeof selected=='undefined' ? c.selected : selected;			$E = $(c.elem);			$E.find('.layui-form-checkbox').removeClass('layui-form-checked');						$E.find('dd').removeClass('layui-this');			//为默认选中值添加类名			var max = s.length>c.max ? c.max : s.length;			for(var i=0;i<max;i++){				if(s[i] && !o.disabledIndex.hasOwnProperty(s[i])){					$E.find('dd[lay-value='+s[i]+']').addClass('layui-this');					}			}			$E.find('dd.layui-this').each(function(){				$(this).find('div').addClass('layui-form-checked');			});				o.setSelected(selected);			}			//设置选中值 每次点击操作后执行		this.setSelected = function(first){			var o=this,c=o.config,f=c.field;			$E = $(c.elem);			var values=[],names=[],selected = [],spans = [];			var items = $E.find('dd.layui-this');			if(items.length==0){				var tips = c.tips.replace('{max}',c.max);				spans.push('<span class="tips">'+tips+'</span>');			}			else{				items.each(function(){					$this = $(this);					var item ={};					var v = $this.attr('lay-value');					var n = $this.find('span').text();					item[f.idName] = v;					item[f.titleName] = n;					values.push(v);					names.push(n);					spans.push('<a href="javascript:;"><span lay-value="'+v+'">'+n+'</span><i class="layui-icon">ဆ</i></a>');					selected.push(item);				});			}			spans.push('<i class="layui-edge" style="pointer-events: none;"></i>');			$E.find('.multiple').html(spans.join(''));							$E.find('.layui-select-title').find('input').each(function(){				if(typeof first=='undefined'){					this.defaultValue = values.join(c.delimiter);				}				this.value = values.join(c.delimiter);			});						var h = $E.find('.multiple').height()+14;			$E.find('.layui-form-select dl').css('top',h+'px');			o.values=values,o.names=names,o.selected = selected;		}		//ajax方式获取候选数据		this.getData = function(url){			var d;			$.ajax({				url:url,				dataType:'json',				async:false,				success:function(json){					d=json;				},				error: function(){					console.error(MOD_NAME+' hint:候选数据ajax请求错误 ');					d = false;				}			});			return d;		}	};		//渲染一个实例  obj.prototype.render = function(){		var o=this,c=o.config,f=c.field;		$E = $(c.elem);		if($E.length==0){			console.error(MOD_NAME+' hint:找不到容器 ' +c.elem);			return false;		}		if(Object.prototype.toString.call(c.data)!='[object Array]'){			var data = o.getData(c.data);			if(data===false){				console.error(MOD_NAME+' hint:缺少分类数据');				return false;			}			o.config.data =  data;		}		//给容器添加一个类名		$E.addClass('lay-ext-mulitsel');		if(/^\d+$/.test(c.width)){			$E.css('width',c.width+'px');		}		//添加专属的style		if($('#lay-ext-mulitsel-style').length==0){		var style = '.lay-ext-mulitsel .layui-form-select dl dd div{margin-top:0px!important;}.lay-ext-mulitsel .layui-form-select dl dd.layui-this{background-color:#fff}.lay-ext-mulitsel .layui-input.multiple{line-height:auto;height:auto;padding:4px 10px 4px 10px;overflow:hidden;min-height:38px;margin-top:-38px;left:0;z-index:99;position:relative;background:#fff;}.lay-ext-mulitsel .layui-input.multiple a{padding:2px 5px;background:#5FB878;border-radius:2px;color:#fff;display:block;line-height:20px;height:20px;margin:2px 5px 2px 0;float:left;}.lay-ext-mulitsel .layui-input.multiple a i{margin-left:4px;font-size:14px;} .lay-ext-mulitsel .layui-input.multiple a i:hover{background-color:#009E94;border-radius:2px;}.lay-ext-mulitsel .danger{border-color:#FF5722!important}.lay-ext-mulitsel .tips{pointer-events: none;position: absolute;left: 10px;top: 10px;color:#757575;}';			$('<style id="lay-ext-mulitsel-style"></style>').text(style).appendTo($('head'));		};				//创建选项		o.createOption();		//设置选中值		o.set();				//展开/收起选项		$E.on('click','.layui-select-title,.multiple,.multiple.layui-edge',function(e){			//隐藏其他实例显示的弹层			$('.lay-ext-mulitsel').not(c.elem).removeClass('layui-form-selected');			if($(c.elem).is('.layui-form-selected')){				$(c.elem).removeClass('layui-form-selected');								$(document).off('click',mEvent);			}			else{				$(c.elem).addClass('layui-form-selected');								$(document).on('click',mEvent=function(e){					if(e.target.id!==c.elem && e.target.className!=='layui-input multiple'){						$(c.elem).removeClass('layui-form-selected');									$(document).off('click',mEvent);					}				});				}		});					//点击选项		$E.on('click','dd',function(e){			var _dd = $(this);			if(_dd.hasClass('layui-disabled')){				return false;			}			//点 请选择			if(_dd.is('.layui-select-tips')){				_dd.siblings().removeClass('layui-this');				$(c.elem).find('.layui-form-checkbox').removeClass('layui-form-checked');			}			//取消选中			else if(_dd.is('.layui-this')){				_dd.removeClass('layui-this');				_dd.find('.layui-form-checkbox').removeClass('layui-form-checked');				e.stopPropagation();			}			//选中			else{				if(o.selected.length >= c.max){					$(c.elem+' .multiple').addClass('danger');					layer.tips('最多只能选择 '+c.max+' 个', c.elem+' .multiple', {						tips: 3,						time: 1000,						end:function(){												$(c.elem+' .multiple').removeClass('danger');						}					});					return false;				}				else{					_dd.addClass('layui-this');					_dd.find('.layui-form-checkbox').addClass('layui-form-checked');					e.stopPropagation();									}			}						o.setSelected();		});				//删除选项		$E.on('click','a i',function(e){			var _this = $(this).prev('span');			var v = _this.attr('lay-value');			if(v){				var _dd = $(c.elem).find('dd[lay-value='+v+']');				_dd.removeClass('layui-this');				_dd.find('.layui-form-checkbox').removeClass('layui-form-checked');			}			o.setSelected();			_this.parent().remove();			e.stopPropagation();					});				//验证失败样式		$E.find('input').focus(function(){			$(c.elem+' .multiple').addClass('danger');			setTimeout(function(){				$(c.elem+' .multiple').removeClass('danger');			},3000);		});	}		//输出模块	exports(MOD_NAME, function (config) {		var _this = new obj(config);		_this.render();		return _this;  });});
 |