123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- /*
- * @version: 1.2
- * @Author: tomato
- * @Date: 2018-4-24 22:56:00
- * @Last Modified by: tomato
- * @Last Modified time: 2018-5-26 18:08:43
- */
- //无限级下拉框
- layui.define(['jquery', 'form'], function(exports){
- var MOD_NAME = 'selectN';
- var $ = layui.jquery;
- var form = layui.form;
- var obj = function(config){
- //当前选中数据值名数据
- this.selected =[];
- //当前选中的值
- this.values = [];
- //当前选中的名
- this.names = [];
- //当前选中最后一个值
- this.lastValue = '';
- //当前选中最后一个值
- this.lastName = '';
- //是否已选
- this.isSelected = false;
- //初始化配置
- this.config = {
- //选择器id或class
- elem: '',
- //无限级分类数据
- data: [],
- //默认选中值
- selected: [],
- //空值项提示,可设置为数组['请选择省','请选择市','请选择县']
- tips: '请选择',
- //是否允许搜索,可设置为数组[true,true,true]
- search:false,
- //选择项宽度,可设置为数组['80','90','100']
- width:null,
- //为真只取最后一个值
- last: false,
- //值验证,与lay-verify一致
- verify: '',
- //事件过滤器,lay-filter名
- filter: '',
- //input的name 不设置与选择器相同(去#.)
- name: '',
- //数据分隔符
- delimiter: ',',
- //数据的键名 status=0为禁用状态
- field:{idName:'id',titleName:'name',statusName:'status',childName:'children'},
- //多表单区分 form.render(type, filter); 为class="layui-form" 所在元素的 lay-filter="" 的值
- formFilter: null
- }
-
- //实例化配置
- this.config = $.extend(this.config,config);
- //“请选择”文字
- this.setTips = function(){
- var o = this,c = o.config;
- if(Object.prototype.toString.call(c.tips)!='[object Array]'){
- return c.tips;
- }
- else{
- var i=$(c.elem).find('select').length;
- return c.tips.hasOwnProperty(i) ? c.tips[i] : '请选择';
- }
- }
- //设置是否允许搜索
- this.setSearch = function(){
- var o = this,c = o.config;
- if(Object.prototype.toString.call(c.search)!='[object Array]'){
- return c.search===true ? 'lay-search ' : ' ';
- }
- else{
- var i=$(c.elem).find('select').length;
- if(c.search.hasOwnProperty(i)){
- return c.search[i]===true ? 'lay-search ' : ' ';
- }
- }
- return ' ';
- }
- //设置是否允许搜索
- this.setWidth = function(){
- var o = this,c = o.config;
- if(Object.prototype.toString.call(c.width)!='[object Array]'){
- return /^\d+$/.test(c.width) ? 'style="width:'+c.width+'px;" ' : ' ';
- }
- else{
- var i=$(c.elem).find('select').length;
- if(c.width.hasOwnProperty(i)){
- return /^\d+$/.test(c.width[i]) ? 'style="width:'+c.width[i]+'px;" ' : ' ';
- }
- }
- }
-
- //创建一个Select
- this.createSelect = function(optionData){
- var o = this,c = o.config,f=c.field;
- var html = '';
- html+= '<div class="layui-input-inline" '+o.setWidth()+'>';
- html+= ' <select '+o.setSearch()+'lay-filter="'+c.filter+'">';
- html+= ' <option value="">'+o.setTips()+'</option>';
- for(var i=0;i<optionData.length;i++){
- var disabled = optionData[i][f.statusName]==0 ? 'disabled="" ' : '';
- html+= ' <option '+disabled+'value="'+optionData[i][f.idName]+'">'+optionData[i][f.titleName]+'</option>';
- }
- html+= ' </select>';
- html+= '</div>';
- return html;
- };
- //获取当前option的数据
- this.getOptionData=function(catData,optionIndex){
- var f = this.config.field;
- var item = catData;
- for(var i=0;i<optionIndex.length;i++){
- if('undefined' == typeof item[optionIndex[i]]){
- item = null;
- break;
- }
- else if('undefined' == typeof item[optionIndex[i]][f.childName]){
- item = null;
- break;
- }
- else{
- item = item[optionIndex[i]][f.childName];
- }
- }
- return item;
- };
- //初始化
- this.set = function(selected){
- var o = this,c = o.config;
- $E = $(c.elem);
- //创建顶级select
- var verify = c.verify=='' ? '' : 'lay-verify="'+c.verify+'" ';
- var html = '<div style="height:0px;width:0px;overflow:hidden"><input '+verify+'name="'+c.name+'"></div>';
- html += o.createSelect(c.data);
- $E.html(html);
- selected = typeof selected=='undefined' ? c.selected : selected;
- var index=[];
- for(var i=0;i<selected.length;i++){
- //设置最后一个select的选中值
- $E.find('select:last').val(selected[i]);
- //获取该选中值的索引
- var lastIndex = $E.find('select:last').get(0).selectedIndex-1;
- index.push(lastIndex);
- //取出下级的选项值
- var childItem = o.getOptionData(c.data,index);
- //下级选项值存在则创建select
- if(childItem){
- var html = o.createSelect(childItem);
- $E.append(html);
- }
- }
- form.render('select',c.formFilter);
- o.getSelected();
- };
-
- //下拉事件
- this.change = function(elem){
- var o = this,c = o.config;
- var $thisItem = elem.parent();
- //移除后面的select
- $thisItem.nextAll('div.layui-input-inline').remove();
- var index=[];
- //获取所有select,取出选中项的值和索引
- $thisItem.parent().find('select').each(function(){
- index.push($(this).get(0).selectedIndex-1);
- });
-
- var childItem = o.getOptionData(c.data,index);
- if(childItem){
- var html = o.createSelect(childItem);
- $thisItem.after(html);
- form.render('select',c.formFilter);
- }
- o.getSelected();
- };
- //获取所有值-数组 每次选择后执行
- this.getSelected=function(){
- var o = this,c = o.config;
- var values =[];
- var names =[];
- var selected =[];
- $E = $(c.elem);
- $E.find('select').each(function(){
- var item = {};
- var v = $(this).val()
- var n = $(this).find('option:selected').text();
- item.value = v;
- item.name = n;
- values.push(v);
- names.push(n);
- selected.push(item);
- });
- o.selected =selected;
- o.values = values;
- o.names = names;
- o.lastValue = $E.find('select:last').val();
- o.lastName = $E.find('option:selected:last').text();
-
- o.isSelected = o.lastValue=='' ? false : true;
- var inputVal = c.last===true ? o.lastValue : o.values.join(c.delimiter);
- $E.find('input[name="'+c.name+'"]').val(inputVal);
- };
- //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;
- $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;
- }
-
- c.filter = c.filter=='' ? c.elem.replace('#','').replace('.','') : c.filter;
- c.name = c.name=='' ? c.elem.replace('#','').replace('.','') : c.name;
- o.config = c;
-
- //初始化
- o.set();
-
- //监听下拉事件
- form.on('select('+c.filter+')',function(data){
- o.change($(data.elem));
- });
- //验证失败样式
- $E.find('input[name="'+c.name+'"]').focus(function(){
- var t = $(c.elem).offset().top;
- $('html,body').scrollTop(t-200);
- $(c.elem).find('select:last').addClass('layui-form-danger');
- setTimeout(function(){
- $(c.elem).find('select:last').removeClass('layui-form-danger');
- },3000);
- });
- }
-
- //输出模块
- exports(MOD_NAME, function (config) {
- var _this = new obj(config);
- _this.render();
- return _this;
- });
- });
|