首页 > 编程 > JavaScript > 正文

jQuery自定义多选下拉框效果

2019-11-19 16:18:43
字体:
来源:转载
供稿:网友

项目中需要自定义一个下拉框多选插件,业务问题还是自己实现比较好

通过$.fn 向jQuery添加新的方法

下拉数据通过参数传递进去,通过调用该插件时接收,选择后的确定与取消事件采用事件传递方式

代码如下:  

1.效果图

2.代码

<div id="demo" class="dropdown-container"> <div class="dropdown-display">  <span></span>  <input type="text" class="iptdiplay" placeholder="请选择" readonly="readonly" /> </div> <div class="dropdown-panel">  <div class="dropdown-search">  <span></span>  <input type="text" class="iptsearch" placeholder="关键字搜索" />  </div>  <ul class="dd-select">  <!-- area for dropdown items -->  </ul>  <div class="dropdown-opt">  <button class="dd-btn ok">确定</button>  <button class="dd-btn cancel">取消</button>  </div> </div> </div> 

.dropdown-container{ display: block; width: 200px; height: 30px; padding: 0px; position: relative; margin: 0px auto;}.dropdown-display{ display: block; height: 30px; position: absolute; top: 0; width:100%; margin: 0px; border:1px solid steelblue;}.dropdown-display span{ background: url(../static/choose_down_icon_01.png) no-repeat left 8px; display: block; height: 25px; width: 10px; position: absolute; right: 5px; top: 3px;}.dropdown-display input[class='iptdiplay']{ border: none; border-color: transparent; background: transparent; border-radius: 0px; box-shadow: none; height: 30px; width: 100%; margin: 0px; box-sizing: border-box; box-shadow: none; padding-left: 10px; padding-right: 18px; outline: none; cursor: pointer; text-overflow: ellipsis;}.dropdown-panel { position: absolute; top: 32px; width:100%; padding: 0px; display: none; border-left: 1px solid steelblue; border-bottom: 1px solid steelblue; border-right: 1px solid steelblue;}.dropdown-panel .dropdown-search{ display: block; width: 100%; height: 30px;}.dropdown-search span{ background: url(../static/chosen-sprite.png) no-repeat 100% -20px,linear-gradient(#eee 1%,#fff 15%); display: block; height: 25px; width: 20px; position: absolute; right: 0px; top: 3px;}.dropdown-search input[class='iptsearch']{ border: none; border-color: transparent; background: transparent; border-radius: 0px; box-shadow: none; height: 30px; width: 100%; margin: 0px; box-sizing: border-box; box-shadow: none; padding-left: 10px; outline: none;}.dropdown-panel .dd-select{ display: block; width:100%; position: relative; height: auto; margin: 0px; padding:0px !important; box-sizing: border-box; list-style-type: none; text-align: left; max-height: 300px; overflow-y: scroll; overflow-x: hidden;}.dd-item{ display: block; height: 30px; line-height: 30px; padding-left: 5px; border-bottom: 1px solid steelblue; font-size: 13px; z-index: 8; overflow: hidden;}.dd-item .dd-v{ width: 0px; height: 0px; display: none;}.dd-item .dd-k{ z-index: 8; padding-left: 15px;}.dd-item:first-child{ border-top: 1px solid steelblue;}.dd-item:last-child{ border-bottom: none;}.dd-select .on{ background-color: steelblue/9;}.dd-item:hover::before,.dd-item:hover before{ content:'/2714'; position: absolute; left: 0px; color: #79a979 z-index: 9; font-size: 16px; padding-right: 3px; padding-left: 2px; background-color: #fff;}.dd-select .on::before,.dd-select .on before{ content:'/2714'; position: absolute; left: 0px; color: green; z-index: 9; font-size: 16px; padding-right: 3px; padding-left: 2px; background-color: #fff;}.dd-item:hover{ cursor: pointer; background-color: #ccc;}.dropdown-container .dropdown-opt{ width:100%; text-align: center; position: absolute; left: -1px; bottom: -30px; padding: 0px; border-left: 1px solid steelblue; border-bottom: 1px solid steelblue; border-right: 1px solid steelblue; box-sizing: content-box;}.dropdown-container .dd-btn{ color: #333; height: 28px !important; display: inline-block; background-color: #e6e6e6; border-color: #adadad; user-select: none; background-image: none; border: 1px solid transparent; border-radius: 4px; margin: 0px 15px;}.dropdown-container .dd-btn:hover{ color:#fff; background-color: steelblue;}/* scrollbar */.dropdown-container ::-webkit-scrollbar { width: 5px; height: 10px; } .dropdown-container ::-webkit-scrollbar-track, .dropdown-container ::-webkit-scrollbar-thumb { border-radius: 999px; border: 5px solid transparent; } .dropdown-container ::-webkit-scrollbar-track { box-shadow: 1px 1px 5px rgba(0,0,0,.2) inset; } .dropdown-container ::-webkit-scrollbar-thumb { min-height: 20px; background-clip: content-box; box-shadow: 0 0 0 5px rgba(0,0,0,.2) inset; } .dropdown-container ::-webkit-scrollbar-corner { background: transparent; }

3.Jquery插件

;(function ($,window,document,undefined) { var _pluginName="jqDropdown"; var defaults = {  items:[] }; var parm=[]; //es5 filter hack if (!Array.prototype.filter){   Array.prototype.filter = function(fun){   var len = this.length;   if (typeof fun != "function") throw new TypeError();     var res = new Array();   var _arg = arguments[1];   for (var i = 0; i < len; i++){     if (i in this){     var val = this[i];     if (fun.call(_arg, val, i, this)) res.push(val);     }   }     return res;   }; } if(!Array.prototype.indexOf) {  Array.prototype.indexOf = function (elem, startFrom) {   var startFrom = startFrom || 0;   if (startFrom > this.length) return -1;   for (var i = 0; i < this.length; i++) {    if (this[i] == elem && startFrom <= i) {     return i;    } else if (this[i] == elem && startFrom > i) {     return -1;    }   }   return -1;  } } var init = function (o,opts,okFn,cancelFn) {  var _panel=$(o);  var _ul=_panel.find(".dd-select:eq(0)");  function createDropItems(items,p){   p=p||[];   _ul.empty();   var _curretVal=$(".iptdiplay").val();   for(var i=0,len=items.length;i<len;i++){    var _d=items[i];    var _li='<li class="{{DC}}"> <span class="dd-v">{{DV}}</span><span class="dd-k">{{DK}}</span></li>';    _ul.append(_li.replace(/{{DV}}/g, _d.val).replace(/{{DK}}/g,_d.name).replace(/{{DC}}/g,p.indexOf(_d.val.toString())>-1?'dd-item on':'dd-item'));   }   _panel.find('.dd-item').click(function(e){    var $this=$(this);    var _k_= $this.find('.dd-k:eq(0)').text()    var _v_= $this.find('.dd-v:eq(0)').text();    if($this.hasClass('on')){     parm=parm.filter(function(t){ return t!=_v_; });     $this.removeClass('on');    }else{     parm.push(_v_);     $this.addClass('on');    }    var disArr=[];    for(var i=0,len=items.length;i<len;i++){     var _d=items[i];     if(parm.indexOf(_d.val.toString())>-1) disArr.push(_d.name);    }    $(".iptdiplay").val(disArr.join('|'));   });  };  //init to build dropdown items  createDropItems(opts.items||[]);  function toggleDrop(){   $(".dropdown-panel").slideToggle();  };    //search  $(".iptsearch").bind("input propertychange",function(e){   if(!e) return;   var _sk=e.currentTarget.value;   var _items=opts.items||[];   createDropItems(_items.filter(function(d){    return d.name.indexOf(_sk)>-1;    }),parm);  });  //Toggle dropdown  $(".dropdown-display").click(function(){   toggleDrop();  });  //OK button event  $(".dropdown-opt button.ok").click(function(){   toggleDrop();   okFn&&okFn.apply(this,[parm]);  });  //Cancel button event  $(".dropdown-opt button.cancel").click(function(){   toggleDrop();   cancelFn&&cancelFn.call(this);  }); }; $.fn[_pluginName] = function (options,okFn,cancelFn) {  var options = $.extend(defaults, options);  return this.each(function () {   init(this,options,okFn,cancelFn);  }); }})(jQuery,window,document);

4.页面调用示例

<script> var data=[  { name:'http://58.100.3.12',val:1 },  { name:'http://44.168.4.13',val:2 },  { name:'http://192.168.2.1/sdfsf/234234/234/2/34/23',val:3 },  { name:'http://220.199.5.14',val:4 },  { name:'http://127.1.62.15',val:5 },  { name:'http://127.1.62.15',val:6 },  { name:'http://127.1.62.15',val:7 },  { name:'http://127.1.62.15',val:8 },  { name:'http://127.1.62.15',val:9 },  { name:'http://127.1.62.15',val:10 },  { name:'http://127.1.62.15',val:11 },  { name:'http://127.1.62.15',val:12 },  { name:'http://127.1.62.15',val:13 },  { name:'http://127.1.62.15',val:14},  { name:'http://127.1.62.15',val:15 },  { name:'http://127.1.62.15',val:16 },  { name:'http://127.1.62.15',val:17 },  { name:'http://127.1.62.15',val:18 },  { name:'http://127.1.62.15',val:19 },  { name:'http://127.1.62.15',val:20 },  { name:'http://127.1.62.15',val:21 },  { name:'http://127.1.62.15',val:22 },  { name:'http://127.1.62.15',val:23 },  { name:'http://127.1.62.15',val:24 },  { name:'http://127.1.62.15',val:25 },  { name:'http://127.1.62.15',val:26 },  { name:'http://127.1.62.15',val:27 },  { name:'http://127.1.62.15',val:28 },  { name:'http://127.1.62.15',val:29 } ]; $("#demo").jqDropdown({ items:data },function(e){  console.dir(e); },function(){  console.log('canceled by user !'); }); </script>

5.输出

6.不足

  页面样式在不支持css3浏览器中显示有问题 后期需要改进

     下拉数据为一次性渲染 如有需要 可设置滚动加载

     下拉框滚动条的美化未兼容所有浏览器

      搜索时检索数据直接源自页面数据 所有需要添加延迟处理 获取服务端数据

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表