昨天看到QQ登录的时候,可以选择以前登录过的账户,这个东西也可以在网站登录的时候用到,所以我就想做一个这样的插件;在网上查了很多,没有找到合适自己的,所以决定自动制作一个。

原理就是一个textbox加一个ul模拟下拉框,用font模拟一个下拉按钮。

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQMAAACDCAIAAAAGdOnwAAADcUlEQVR4nO3csWtddRjH4QuhdLhz1y7+ATo5SP4Hh25CcZHsTkJQEJwcMnRwl0Dp6FBEh06lgwgi7RJwEYVAcFD0uhQCX4fX1pBwz/3l3nvOPSc+z9Sm9x4aeD9pfic97yxAMtv1XwBGQQmQXC3hKdx0rSX0UhyMgxIgUQIUJUCiBCak1yFUApOhBEiUAEUJkFxvCBdH9/fnd/Z/PFtseHElMDrNQ7g4ur8/m92az2+1x6AEJqNtCCuD+UdffP3zT0/fvjNvjEEJTEbDEP6XwQ/Pvnpw/OTX59++2RaDEpiMlUP43Zcf7/2bwcO7t/dms9m9w0cVw1vvfvrXWhdXAqPTMIQvT385ffHs4d3be2+88/7R4Xt7s9m9w0d//v7bH3+/XO/iSmB0Wobw5FUGJ2eL5Pzx5x9UDOfrXlwJjM7KITx9/vhCBqU1BiUwGSuHcHH24pMPPzu5fDg+f3L84Pib75XADeFnzJAoAYoSIFECFCVAogQYgBIgUQIUJUCiBCjXKAFuttYSNs8ORksJkCgBihIgUQKUfks4ODhY410wvK2VcHHoX/+6vYSDJRrfDhva5r8JVwNYY5RNPzvRVwkdX927/+janwFsw/bPCe2T3Z2HKhjSLk/M3c0ogSFtoYRLX8WXnX27Z30rZwxYWy/nhLQNdGMJHWn5hoptmUAJMAAlQNL3zxOWfbDlZUpgSDsu4eI5e9kbYQDbL6F74q/+tuUK0Lct/7+jxiHuyKDjBdCf7ZRwaYjXuMvZfYqAvo3i+YRlQy8GBjOKEmDnlACJEqAoARIlQFECJEqAogRIlABFCZAoAYoSIFECFCVAYlc2FLuyIbErG8pkdmV3PxSqHzZkVzYkdmVDsSsbEntRoSgBEiVAsSsbkp2XcPGcveyNMIAJ7MruuBm18vYUNLIrGxK7sqGM4vmEZUMvBgYzihJg55QAiRKgKAESJUBRAiRKgKIESJQARQmQKAGKEiBRAhQlQGJXNhS7siGZyq5sDzHTt8nsyoZe2ZUNiV3ZUOzKhmRCe1E7AvOtFJubTAnQKyVAsvMNwR0vUwJDsisbkknsyoYBTGBX9sq7Ru4gsTm7siEZyfMJy4ZeDAxmFCXAzikBEiVAUQIkSoCiBEiUAEUJkCgByjVKgJutqQT4f1ICJEqAogRIlABFCZAoAco/wuWnEzqjp3gAAAAASUVORK5CYII=" alt="" />

一、制作静态效果

先用css和html,做出一个应该有的样子。这里这两个aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAXCAIAAABrvZPKAAAAwklEQVQ4jWP4TxlgGNb6P/fG2nCL2px/8ZkM/Z97Y20YGFi5uVnxGIFLP0Qzd/nUrfdvHTIT5cZlBFb9CM1nj6yfuGjPo4s79HEYgUX/iQU1zFDNS+XYmRkYGIKrlkOMMPBv+ESE/T+fPnx66chSOXZmZav43qooZgaG4KrlH9+9ev/lJ1H+vw7TfP3F5////2zuTIEY8YcY/z+9uBlJMwTgNAKL/s8vLtUWNl9HD6o/exZNXLT9FGH9JIFR/aP6KQEAnLQ+lLu2SbcAAAAASUVORK5CYII=" alt="" />aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAASCAIAAADQR7l6AAAAxElEQVQ4jWP4TzFgGNZGfD5z6tIfDNGn187dfvGZKCNOLKhhZmAILFvyE0nw+pGlcuzMBv4Nn4hzxZ/NnSnIpkD0K1vFXyfSFWimXMKrH7sRTy9uNZK32nfrOcQUBgYGZav4q09u57kYJTWvxgwjLEZ8fnHJT12cmV1u88VHW/vyjFxSrj65nWmlzMwuN3P7KaKMQDXl6Z9fT/Hox2kEkiniBroyePTjMwLZLXj0EzDi////n1/cPnLqBh79hI0gBgwbIwCNaDpcLXAPbQAAAABJRU5ErkJggg==" alt="" />我使用的是字体,可以在icomoon网站上面自己制作。用字体的好处是和输入框定位很方便,而且还可以控制大小颜色等,唯一的不足是IE6和IE7由于不支持:before选择器,导致无法显示这种字体,但可以通过一些其他方法实现,大家可以自己尝试下。下面是html代码

<span style="display:inline-block;position:relative" class="combox_border">
<input type="text" class="combox_input"/><font class="ficomoon icon-angle-bottom combox_button" style="display:inline-block"></font>
<ul style="position:absolute;top:29px;left:-1px" class="combox_select">
<li><a href="javascript:void(0)">选项一</a></li>
<li><a href="javascript:void(0)">选项二</a></li>
<li><a href="javascript:void(0)">选项三</a></li>
<li><a href="javascript:void(0)">选项四</a></li>
</ul>
</span>

1、标签中有style和class,这个style就是必须属性,一定要有

2、最外围是用span来做包裹的,然后给了个inline-block属性,之所以用行内元素是为了以后布局的方便,换成块元素也是可以的,但很多时候块元素会伴随着float浮动等样式,控制起来比较麻烦

3、ficomoon icon-angle-bottom在定义字体

4、span的属性position是relative,下拉我就打算用ul定位来模拟,ul的position是absolute,top以后可以根据jquery来获取span的高度设置,left就写死了

5、li里面的内容我加了个a标签,这里就是想偷懒一下,a标签有个:hover伪类,移上去可以改变CSS,这样我就能少写这个移到内容上去变样式的特效

下面是CSS代码:

@font-face {
font-family: 'icomoon';
src:url('fonts/icomoon.eot?-fl11l');
src:url('fonts/icomoon.eot?#iefix-fl11l') format('embedded-opentype'),
url('fonts/icomoon.woff?-fl11l') format('woff'),
url('fonts/icomoon.ttf?-fl11l') format('truetype'),
url('fonts/icomoon.svg?-fl11l#icomoon') format('svg');
font-weight: normal;
font-style: normal;
}
.ficomoon{font-family:'icomoon';}
.icon-angle-top:before {content: "\f102"}.icon-angle-bottom:before {content: "\f103"}
/*下面的可根据自己的实际情况做修改*/
.combox_border{border:1px solid #c2c2c2;height:28px;width:245px}
.combox_input{border:;line-height:25px;height:25px;padding-left: 5px;width:85%;vertical-align: middle;}
.combox_button{width:12%;text-align:center;vertical-align: middle;cursor:pointer;border-left:1px solid #c2c2c2}
.combox_select{border:1px solid #c2c2c2;border-top:;width:100%}
.combox_select li{overflow:hidden;height:30px;line-height:30px;cursor:pointer;}
.combox_select a {display: block;line-height: 28px;padding: 0 8px;text-decoration: none;color: #666;}
.combox_select a:hover {text-decoration: none;background:#f5f5f5}

这里的combox_border等样式可以自定义,可以加CSS3样式美化,我这里就做了个朴素的样式。

二、制作JS特效

在做JS的时候,碰到个奇怪的问题,就是放在任何浏览器中都不会报错,但是在IE6死活提示未设置的对象属性的错误,最后发现是因为js文件编码的问题,不是UTF-8,改变下编码就可以了。

先是一个jquery插件格式

(function($){
$.fn.combox = function(options) { };
})(jQuery);

然后是添加默认参数

var defaults = {
borderCss: "combox_border",
inputCss: "combox_input",
buttonCss: "combox_button",
selectCss: "combox_select",
datas:[]
};
var options = $.extend(defaults, options);
borderCss
最外面包裹的样式,就是上面的span
inputCss
输入框的样式
buttonCss
按钮的样式,就是aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAiCAIAAACiBwxcAAAA9ElEQVRYhWP4P0CAYcAsPkR3MDA+HrV4UFgMlxu1eNTi////f+6NteEWtTn/4jM9Lf7cG2vDwMDKzc1KvN2UWwyxlbt86tb7tw6ZiXITaTeFFiNsPXtk/cRFex5d3KFPnN0UWXxiQQ0z1NalcuzMDAwMwVXLIXYb+Dd8op3F////fPrw6aUjS+XYmZWt4nuropgZGIKrln989+r9l5/4dVIax9dhtl5/8fn//z+bO1Mgdv8hpJEii59e3IxkKwQQazdFFn9+cam2sPk6ejr6s2fRxEXbT9HQYkrAqMWjFg+IxTQFoxaPJItp0CsjAAbaxwNlMQAPJyKIQru+VQAAAABJRU5ErkJggg==" alt="" />
selectCss
下拉列表的样式
datas
 下拉列表中的内容

然后是一个渲染的方法

this.each(function() {
var _this = $(this);
_this = _initBorder(_this);//初始化外框CSS IE6中需要有返回值
_this = _initInput(_this);//初始化输入框
_initSelect(_this);//初始化下拉列表
});

动态的生成输入框,按钮,下拉框,附上样式和时间。我将三个渲染分别放在了三个函数中,这样清晰一点

       function _initBorder($border) {//初始化外框CSS
$border.css({'display':'inline-block', 'position':'relative'}).addClass(options.borderCss);
return $border;
} function _initInput($border){//初始化输入框
$border.append('<input type="text" class="'+options.inputCss+'"/>');
$border.append('<font class="ficomoon icon-angle-bottom '+options.buttonCss+'" style="display:inline-block"></font>');
//绑定下拉特效
$border.delegate('font', 'click', function() {
var $ul = $border.children('ul');
if($ul.css('display') == 'none') {
$ul.slideDown('fast');
$(this).removeClass('icon-angle-bottom').addClass('icon-angle-top');
}else {
$ul.slideUp('fast');
$(this).removeClass('icon-angle-top').addClass('icon-angle-bottom');
}
});
return $border;//IE6需要返回值
} function _initSelect($border) {//初始化下拉列表
$border.append('<ul style="position:absolute;left:-1px;display:none" class="'+options.selectCss+'">');
var $ul = $border.children('ul');
$ul.css('top',$border.height()+1);
var length = options.datas.length;
for(var i=0; i<length ;i++)
$ul.append('<li><a href="javascript:void(0)">'+options.datas[i]+'</a></li>');
$ul.delegate('li', 'click', function() {
$border.children(':text').val($(this).text());
$ul.hide();
$border.children('font').removeClass('icon-angle-top').addClass('icon-angle-bottom');//确定的时候要将下拉的icon改变
});
return $border;
}

三个函数中的参数我都加了个$符号,便于自己知道这是一个jquery对象。这几个函数中没什么技术难点,都是非常普通自然的逻辑,大家也可以随时根据自己的不同需求改变代码,插件总共只有50几行,非常容易修改。

下面是调用插件:

<script type="text/javascript">
$(document).ready(function() {
$('#combox').combox({datas:['选项一','选项二','选项三']});
})
</script>
</head>
<body>
  <span id="combox"></span>
</body>
</html>

一句话就可以了,挺方便的。

2014-08-22补充

最近在实际项目中使用了这个插件,碰到了些新问题:

1.在实际项目中,最后是要取那个动态生成的输入框中的值的,这样的话就得定位这个输入框,可以在默认参数中新增了一个inputId,控制它

2.如果下拉列表中没有内容,那就没必要调用_initSelect这个方法了

if(options.datas.length > 0)
_initSelect(_this, this);//初始化下拉列表

3.点击了下来按钮后,下拉内容显示,一定要选中某个内容后,才能把下拉框隐藏掉,这个不太方便,在网上搜索了相关代码

//点击其他地方影藏下拉列表
$(document).click(function(e) {
e = window.event || e; // 兼容IE7
var $obj = $(e.srcElement || e.target);
if($obj.closest($border).length <= 0) {
$ul.hide();
$border.children('font').removeClass('icon-angle-top').addClass('icon-angle-bottom');//确定的时候要将下拉的icon改变
}
});

完整demo下载:

http://download.csdn.net/download/loneleaf1/7703033

2014-08-22修改过的combox.js下载:

jquery.combox.rar

自制jquery可编辑的下拉框的更多相关文章

  1. 用MVC的辅助方法自定义了两个控件:“可编辑的下拉框控件”和“文本框日历控件”

    接触MVC也没多长时间,一开始学的时候绝得MVC结构比较清晰.后来入了门具体操作下来感觉MVC控件怎么这么少还不可以像ASP.net form那样拖拽.这样设计界面来,想我种以前没学过JS,Jquer ...

  2. jQuery自定义漂亮的下拉框插件8种效果演示

    原始的下拉框不好看这里推荐一个jQuery自定义漂亮的下拉框插件8种效果演示 在线预览 下载地址 实例代码 <!DOCTYPE html> <html lang="en&q ...

  3. jquery选中将select下拉框中一项后赋值给text文本框

    jquery选中将select下拉框中一项后赋值给text文本框,出现无法将第一个下拉框的value赋值给文本框 因为select默认选中第一项..在选择第一项时,便导致无法激发onchange事件. ...

  4. jquery+html三级联动下拉框

    jquery+html三级联动下拉框及详情页面加载时的select初始化问题   html写的三个下拉框,如下: <select name="ddlQYWZYJ" id=&q ...

  5. Dropdown.js基于jQuery开发的轻量级下拉框插件

    Dropdown.js 前言 在SPA(Single Page Application)盛行的时代,jQuery插件的轮子正在减少,由于我厂有需求而开发了这个插件.如果觉得本文对您有帮助,请给个赞,以 ...

  6. jquery取消选择select下拉框

    有三个select下拉框一个大类,两个小类隐藏,需要在选择大类的时候,小类显示同时清除另外的小类选择的项这需求有点儿.......... 下面是三个select: <select name=&q ...

  7. jquery easyui无法绑定下拉框内容

    最近在研究jquery easyui的DataGrid,发现DataGrid中的下拉框无法绑定值,找了很久也没发现是具体问题所在,最后还是同事帮忙搞定的.具体问题竟然是jquery easyui提供的 ...

  8. jQuery自定义多选下拉框

    项目中需要自定义一个下拉框多选插件,业务问题还是自己实现比较好 通过$.fn 向jQuery添加新的方法 下拉数据通过参数传递进去,通过调用该插件时接收,选择后的确定与取消事件采用事件传递方式 代码如 ...

  9. js:jquery multiSelect 多选下拉框实例

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

随机推荐

  1. JUnit Assert方法总结

    junit中的assert方法全部放在Assert类中,总结一下junit类中assert方法的分类.1.assertTrue/False([String message,]boolean condi ...

  2. 道路翻新 (Revamping Trails, USACO 2009 Feb)

    题意:给定m<=50000的1-n有联通的图,求最多可以使K<=20条边变为0的情况下的最短路是多少.. 思路:简单的分层图最短路,对于每个点拆成K个点.. 然后求一边最短路.. code ...

  3. lxc on centos

    终于把lxc的网络配通了,也不知道对不对,记一下 一开始都是雷同的地方 yum install libcgroup lxc lxc-templates 安装lxc cgroup 然后记得 chkcon ...

  4. Amazon RDS MySQL数据库还原时 log_bin_trust_function_creators 错误解决办法

    使用了Amazon AWS EC2免费云空间,数据库实例采用Amazon RDS.原来在Windows Server上有一个存在大量数据的MySQL数据库.现在需要在Amazon RDS上还原这个My ...

  5. bootstrap-datetimepicker.js 设置开始时间的Bug。

    原地址:http://www.malot.fr/bootstrap-datetimepicker 修改的地方有三处: 1. var months = this.setTitle('.datetimep ...

  6. 算法:POJ1007 DNA sorting

    这题比较简单,重点应该在如何减少循环次数. package practice; import java.io.BufferedInputStream; import java.util.Map; im ...

  7. 一致性hash的理解

    参考: http://www.blogjava.net/hello-yun/archive/2012/10/10/389289.html http://blog.csdn.net/cywosp/art ...

  8. 人人都是 DBA(XV)锁信息收集脚本汇编

    什么?有个 SQL 执行了 8 秒! 哪里出了问题?臣妾不知道啊,得找 DBA 啊. DBA 人呢?离职了!!擦!!! 程序员在无处寻求帮助时,就得想办法自救,努力让自己变成 "伪 DBA& ...

  9. nodejs获取客户端IP Address

    在网上看见很多问node.js如何获取客户端IP,所以记录下来,以供大家参考. function getClientIp(req) { return req.headers['x-forwarded- ...

  10. session机制详解以及session的相关应用

    session是web开发里一个重要的概念,在大多数web应用里session都是被当做现成的东西,拿来就直接用,但是一些复杂的web应用里能拿来用的session已经满足不了实际的需求,当碰到这样的 ...