项目中需要自定义一个下拉框多选插件,业务问题还是自己实现比较好
通过$.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".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浏览器中显示有问题 后期需要改进
下拉数据为一次性渲染 如有需要 可设置滚动加载
下拉框滚动条的美化未兼容所有浏览器
搜索时检索数据直接源自页面数据 所有需要添加延迟处理 获取服务端数据
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
暂无“jQuery自定义多选下拉框效果”评论...
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新动态
2024年11月14日
2024年11月14日
- 黑鸭子2010-再度重相逢[首版][WAV+CUE]
- 【原神手游】5.2版本圣遗物优化详情
- 方季惟.1989-一生只爱一次【蓝与白】【WAV+CUE】
- 群星.1997-强力舞曲总动员【金点】【WAV+CUE】
- 盘尼西林.2024-岛与黎明【智慧大狗】【FLAC分轨】
- 刀郎《柔情经典》 2CD[WAV分轨][3.8G]
- 群星2024《民谣精选》原音母版1:1直刻[低速原抓WAV+CUE][1.1G]
- 经典《泰坦尼克号原声大碟》[WAV+DSF+FLAC多版][5.2G]
- 魔兽世界兽王猎输出宏代码是什么 兽王猎翻页输出宏命令代码分享
- 魔兽世界wlk野德一键输出宏是什么 wlk野德一键输出宏介绍
- wlk鸟德一键输出宏是什么 wlk鸟德一键输出宏介绍
- 《明末:渊虚之羽》外网新宣传:有勇气面对障碍吗?
- 视觉盛宴!V社公布《看火人》团队新作水面物理效果演示
- 张艺谋呼吁观众走进影院看电影:对解说短视频很无语
- 车载音乐最强享受 《车载极致女声精选》[WAV分轨][1G]