基于jquery, 可多选/可过滤重复/可限制个数. 是以前的项目中用到过的一个项目, 当初是用原生js东拼西凑的, 用jquery重写了下,已封装成插件.暂时没有对手动输入的做判断, 需要的话, 可自行在keyup及change事件中添加相关判断.
<style>
#demo input{_margin-top:1px;padding-left:5px;border:1px solid #999;width:700px;height:20px;font-size:14px;color:#000}
#dropbox{display:none;z-index:9999;padding:5px;background:#fff;border:1px solid #999;border-top:0;z-index:999}
#dropbox a{margin-right:8px;text-decoration:none}
#dropbox a:hover{text-decoration:underline}
#dropbox p{line-height:24px}
#dropbox em.close{float:right;color:#999;font-style:normal;cursor:pointer}
</style><div id="dropbox">
<em class="close" title="关闭">关闭</em>
<p><strong>温馨提示:</strong>选择下面的热门标签及使用过的标签,标签将自动排列至表单域。</p>
<p><strong>热门标签:</strong><a href="网页特效:void(0)">时光漫步</a><a href="javascript:void(0)">javascript</a><a href="javascript:void(0)">jquery plugin</a><a href="javascript:void(0)">那一年</a><a href="javascript:void(0)">jquery插件</a><a href="javascript:void(0)">简单</a><a href="javascript:void(0)">星空</a><a href="javascript:void(0)">梦田</a><a href="javascript:void(0)">晴朗</a><a href="javascript:void(0)">mrthink.net</a></p>
<p><strong>您使用过的标签:</strong><a href="javascript:void(0)">许巍</a><a href="javascript:void(0)">sophie zelmani</a><a href="javascript:void(0)">王菲</a><a href="javascript:void(0)">小娟&山谷里的居民</a><a href="javascript:void(0)">ke$ha</a><a href="javascript:void(0)">shakira</a><a href="javascript:void(0)">朴树</a><a href="javascript:void(0)">罗大佑</a></p>
</div>
<!--//弹出下拉框--><br style="clear:both" />
<br style="clear:both" />
<br />
<input value="我是用来测试的" style="width:200px" />
<select>
<option>我是用来测试的下拉列表</option>
<option>00</option>
<option>00</option>
<option>00</option>
</select></div>
<input value="我是用来测试的" style="width:200px" />
<select>
<option>我是用来测试的下拉列表</option>
<option>one</option>
<option>two</option>
<option>three</option>
</select><!--demo end-->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
<script>
/*******************************
* @author mr.think
* @author blog http://mrthink.net/
* @2010.11.10
* @可自由转载及使用,但请注明版权归属
*******************************/
//调用bgiframe,解决ie6下遮住下拉列表的问题
//bgiframe函数 copyright (c) 2006 brandon aaron (http://brandonaaron.net)
;(function($){
$.fn.bgiframe = $.fn.bgiframe = function(s) {
// this is only for ie6
if ( $.browser.msie && /6.0/.test(navigator.useragent) ) {
s = $.extend({
top : 'auto', // auto == .currentstyle.bordertopwidth
left : 'auto', // auto == .currentstyle.borderleftwidth
width : 'auto', // auto == offsetwidth
height : 'auto', // auto == offsetheight
opacity : true,
src : 'javascript:false;'
}, s || {});
var prop = function(n){return n&&n.constructor==number?n+'px':n;},
html = '<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'+s.src+'"'+
'style="display:block;position:absolute;z-index:-1;'+
(s.opacity !== false?'filter:alpha(opacity='0');':'')+
'top:'+(s.top=='auto'?'expression(((parseint(this.parentnode.currentstyle.bordertopwidth)||0)*-1)+'px')':prop(s.top))+';'+
'left:'+(s.left=='auto'?'expression(((parseint(this.parentnode.currentstyle.borderleftwidth)||0)*-1)+'px')':prop(s.left))+';'+
'width:'+(s.width=='auto'?'expression(this.parentnode.offsetwidth+'px')':prop(s.width))+';'+
'height:'+(s.height=='auto'?'expression(this.parentnode.offsetheight+'px')':prop(s.height))+';'+
'"/>';
return this.each(function() {
if ( $('> iframe.bgiframe', this).length == 0 )
this.insertbefore( document.createelement(html), this.firstchild );
});
}
return this;
};
})(jquery);//选择标签至文本域插件
;(function(){
$.fn.extend({
iselecttags:function(options){
var iset={
name:'.tagsbox',//表单或class或id名
drop:$('#dropbox'),//弹出框定位
ps教程eudoclass:$('#dropbox>p>a'),//可选择的标签定位
close:$('em.close'),//关闭按钮定位
separator:',',//标签间分隔符,建议使用英文逗号
maxcount:10 //默认限制个数,也可以设置表单的data-count值覆盖默认值
}
options=$.extend(iset, options || {});
var _input=$(iset.name);
var _inputval=_input.val();
var _arr=new array(); //存放标签的数组
var _left=_input.offset().left; //左绝对距离
var _top=_input.offset().top+_input.outerheight(); //上绝对距离,此处要加上表单的高度
var _dropw=_input.outerwidth()-parseint(_input.css教程('border-left-width'))-parseint(_input.css('border-right-width'))-parseint(iset.drop.css('paddingleft'))-parseint(iset.drop.css('paddingright'));
iset.drop.css({'position':'absolute','left':_left+'px','top':_top+'px','width':_dropw+'px'});
//弹出框的宽度,此处计算的是与表单实际宽度相等的.也可以直接在样式中定义.
var _txt=null;
var _maxcount=parseint(_input.attr('data-count'));//限制选择个数
if(isnan(_maxcount)){
_maxcount=iset.maxcount
}
_input.click(function(){
iset.drop.show();
iset.drop.bgiframe();//调用bgiframe插件,解决ie6下select的z-index无限大问题
}).bind('keyup change',function(){
//可以在此处扩展手动输入标签情况下的相关判断
//if语句可避免清空重新选择时第一个字符为逗号
if ($(this).val() == '') {
_arr = new array();
}else {
_arr = $(this).val().split(iset.separator);//当用户手动删除或修改标签值后更新标签值
}
});
$(document).click(function(e){
//点击非弹出框区域时关闭弹出框
//下面的 if语句是用来判断传入的是class还是id
if(iset.name.charat(0)=='#'){
if(e.target.id!=iset.name.substring(1)){
iset.drop.hide();
}
}else if(iset.name.charat(0)=='.'){
if(e.target.classname!=iset.name.substring(1)){
iset.drop.hide();
}
}
});
iset.drop.click(function(e){
//阻止弹出框区域默认事件
e.stoppropagation();
});
iset.pseudoclass.click(function(){
//标签选择
_txt=$(this).text();
//下面的$.inarray是用来判断是否重复
//若想反馈重复提示或走出限制个数提示,可改进下面的if语句
if(($.inarray(_txt,_arr)==-1) && (_arr.length<_maxcount )){
_arr.push(_txt);
_inputval=_arr.join(iset.separator);
_input.val(_inputval);
}
});
//关闭按钮
iset.close.click(function(){
iset.drop.hide();
});
}
});
})(jquery);//插件调用
$(function(){
$('#demo').iselecttags();
/*
* 还可以传入参数调用
$('#test').iselecttags({
name:'#test',
drop:$('.drop'),
...
});
*/
});
</script>