好久没来了,更新下插件,

这个原理就是利用的 input[type='hidden']和自定义属性data-value捆绑传值操作的,可是设置默认选项,回调等参数,代码不多,比较简单,吼吼

(function($){    

    //模拟下拉框
$.fn.htmlSelect = function(opt){
if($(this).length==0) return false;
var opts = $.extend({
defaultsItem : 0, //默认选中的select项
saveInput : '<input type= "hidden" />',
showSelect : '.show',
callback : function(){} //选择完毕后触发回调
},opt); function SimulateSelect(o){
this.o = o;
this.defaultsItem = opts['defaultsItem'];
this.saveInput = opts['saveInput'];
this.callback = opts['callback'];
this.showSelect = this.o.find(opts['showSelect']);
this.hideInp = null;
this.selList = this.o.find('ul');
this.curItem = this. defaultsItem; //当前选中 } SimulateSelect.prototype = {
init : function(){
var _this = this;
_this.creatInput().changeValue().toogleSelList().keyboard(); $(document).on("click", function() { //点击文档空白处 下拉框消失
if(_this.o.hasClass("open")){
_this.closeSelect(_this.o);
}
});
return this;
},
creatInput : function(){
var _this = this;
if($.type(_this.saveInput) == "string"){ //判断若参数为jq对象,则直接指向这个input对象,若为字符串,则插入dom
this.o.append(_this.saveInput);
_this.hideInp = this.o.find('input:hidden');
}else{
_this.hideInp = _this.saveInput
}
if($.type(_this.defaultsItem) == 'number'){
_this.curItem = _this.selList.find('li').eq(_this.defaultsItem);
} return this;
}, changeValue : function(){
var _this = this; _this.curItem.addClass('selected').siblings().removeClass(); var v = _this.curItem.attr('date-value'),s = _this.curItem.html(); _this.showSelect.html(s);
_this.hideInp.val(v); return this;
}, toogleSelList : function(){ //展开收起列表
var _this = this; this.o.on('click',function(e){
if($(this).hasClass("open")){ _this.closeSelect($(this));
}else{ $(this).addClass('open');
_this.selList.show();
} var src = e.target,s = ''; if(src.tagName.toLowerCase() == "li"){
s = src.innerHTML;
_this.showSelect.html(s);
$(src).addClass('selected').siblings().removeClass();
var v = $(src).attr("date-value");
_this.hideInp.val(v);
_this.curItem = $(src); if(_this.callback){
_this.callback(v);
}
} e.stopPropagation();
}) return this;
}, closeSelect : function(obj){
this.selList.hide();
obj.removeClass('open'); return this;
}, keyboard : function(){ //注册键盘事件
var _this = this;
$('body').on('keydown',function(e){ //这块要用body,不然不兼容ie7,8
switch(e.keyCode) {
case 38:
_this.prevItem();
break; case 40:
_this.nextItem();
break;
defaults:
return;
}
})
},
prevItem :function(){
var _this = this;
if(_this.o.hasClass('open')){
if(_this.curItem.prev().length > 0){
_this.curItem = _this.curItem.prev();
_this.changeValue();
}
}
return this; }, nextItem :function(){
var _this = this;
if(_this.o.hasClass('open')){
if(_this.curItem.next().length > 0){
_this.curItem = _this.curItem.next();
_this.changeValue();
} }
return this; } } return this.each(function () {
var $this = $(this);
var obj = new SimulateSelect($this);
obj.init()
}); }
})(jQuery)

css

.select{ position: relative; padding-right: 20px; }
.select .ico2{position: absolute; display: block; right: 0; top:10px;cursor: pointer;}
.select .show{color:#333333; height: 40px; line-height: 40px; min-width: 80px;*margin-top:-10px; text-align: center; font-size: 14px; display: block;padding-left: 10px; cursor: pointer;}
.dropList{ max-height: 510px; overflow: auto; position: absolute; top:40px; width: 100%; left: -1px; background: #FFF; z-index: 99; padding-top: 5px; padding-bottom: 2px; display: none;}
.dropList li{ line-height: 30px;margin:0 3px; padding-left: 10px; cursor: pointer;}
.dropList li:hover{color:#333;}
.dropList li.selected{background: #b9b9b9; color:#FFF;}

html:

<div class="select ">
<span class='show'>中国(+86)</span> <ul class="dropList bd">
<li class='selected' date-value = '0'>中国(+86)</li>
<li date-value = '11'>美国(+1)</li>
<li date-value = '3'>澳大利亚(+61)</li>
<li date-value = '4'>台湾(+668)</li>
<li date-value = '5'>美国(+1))</li>
</ul> </div>

  

调用

$(function(){

    $('#phone').htmlSelect({
callback:function(i){ } //i为当前选中的 data-value的值 })
})

  

 

  

jq插件又来了,模拟select下拉框,支持上下方向键哦的更多相关文章

  1. jquery实现模拟select下拉框效果

    <IGNORE_JS_OP style="WORD-WRAP: break-word"> <!DOCTYPE html PUBLIC "-//W3C// ...

  2. 用div,ul,input模拟select下拉框

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  3. ul -- li 模拟select下拉框

    在写项目中 用到下拉框,一般用 <select name="" id=""> <option value=</option> &l ...

  4. 模拟select下拉框、复选框效果

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  5. [原创]HTML 用div模拟select下拉框

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML xmlns=" ...

  6. div+css模拟select下拉框

    <!DOCTYPE html><html ><head lang="zh"> <meta http-equiv="Content ...

  7. jQuery插件:模拟select下拉菜单

    没搞那么复杂,工作中,基本够用.. <!doctype html> <html> <head> <meta charset="utf-8" ...

  8. css配合js模拟的select下拉框

    css配合js模拟的select下拉框 <!doctype html> <html> <head> <meta charset="utf-8&quo ...

  9. jQuery插件实现select下拉框左右选择_交换内容(multiselect2side)

    效果图: 使用jQuery插件---multiselect2side做法: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitio ...

随机推荐

  1. (原+转)Ubuntu下安装understand及在启动器中增加快捷方式

    参考网址: http://www.xuebuyuan.com/1353431.html http://www.2cto.com/os/201309/242543.html http://my.osch ...

  2. [ofbiz]设置任务计划(job),提示service_item已经传递

    问题描述:设置任务计划(job),提示service_item已经传递 解决办法: 红色框内不要填写,就可以了."已经传递"是翻译的不准确,应该是"已过时",所 ...

  3. Python学习笔记一,输入输出

    输出:用print()在括号中加上字符串,就可以向屏幕上输出指定的文字.比如输出'hello, world',用代码实现如下>>>print('hello,world') 也可以是多 ...

  4. haproxy之配置文件解析

    功能--> 提供高可用/负载均衡/基于tcp和http应用的代理;支持虚拟主机,特别适用于负载特大的web站点. 配置文件解析--> #配置文件-->开启/proc/net/ipv4 ...

  5. 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE解决办法【转自wjr2012的csdn blog】

    点击下载Genymotion-ARM-Translation.zip 将你的虚拟器运行起来,将下载好的zip包用鼠标拖到虚拟机窗口中,出现确认对跨框点OK就行.然后重启你的虚拟机.

  6. 2015年网易考拉海淘android面试

    经朋友推荐,昨天下午去网易杭州公司参加了考拉海淘android客户端的面试.今天回忆一下面试题目,做个整理进行备案. 1.说说JVM垃圾回收机制. 1.1.画了JVM分代回收的图,大致说了下垃圾分代回 ...

  7. JavaScript事件处理

    客户端javascript程序采用了异步事件驱动程序,在这种程序设计风格下,当文档,浏览器,元素,或与之相关的对象发生某些有趣的事件时,web浏览器就会产生事件.事件本身不是javascript对象. ...

  8. USBASP下载线制作教程

  9. QAction系列详解

    QAction系列详解 一.QAction类详解 [详细描述] QAction类提供了抽象的用户界面action,这些action可以被放置在窗口部件中.        应用程序可以通过菜单,工具栏按 ...

  10. 剑指offer-面试题12.打印1到最大的n位数

    题目:输入数字n,按照打印出从1最大的n位10进制数.比如3,则 打印出1.2.3一直到最大的3位数即999 1.你觉得如果面试会有这么简单的题,那 只能说明你---太天真. 2.n=3尚可,如果n= ...