扩展select下拉框,(当数据过多的时候以弹出框的形式显示)
扩展select下拉框,(当数据过多的时候以弹出框的形式显示)
Table of Contents
- 问题描述:
- 解决方案
- 遇到问题
- 解决方案
- 结果
- 补充方案
- 添加一项option,更多…
- 在弹出框中执行后,要fire或者(jquery trigger)
- 具体代码&&注释
- 调用
- html
- js
问题描述:
- select下拉框,可能有50个值,也可能有3个值,而且3,4个值的情况还很多..当有50个值的时候,下拉框会很长,显示效果非常不好.如果直接用弹出框来显示,3,4个值的时候显示不好
解决方案
- 设定值,比如5,当小于5个值的时候用select,option来显示,
- 当大于5个的时候,用弹出框,来显示
$("select").on("click",function(){
//弹出框...
})
遇到问题
- 当大于5个时,对select用click事件,发现下拉框也下拉了,而且在弹出框的 遮罩层
解决方案
- 清空select中的所有option
$("select").empty();
结果
- 当点击时,会出现一个空的option,,,so….
- 该方案扑街….
补充方案
既然click后,会出现多余的弹出框,无可避免…无奈,小样,你牛逼,赢了,让你出..
添加一项option,更多…
<!-- 将value设置为空,因为一般当change的时候要执行一个方法,,所以,change里面一定要判断是否有返回值. -->
<option value="">更多...</option>
在弹出框中执行后,要fire或者(jquery trigger)
具体代码&&注释
Com = {
/**
* 需要为select...调用
* maxSize 默认为5
* 当超过maxSize的数值时,会增加"更多..."一项,点击弹出弹出框,进行选择...
* 对onchange来说,当选择的是"更多"的时候,会返回''..用if(result)等方式来写
* 对于弹出框,当选择值后会自动触发change,,故不用管...
*/
SelectMore:function(conf){
var me = this;
var defaults = {
id:'', //
showProperty:[], //要显示的属性,可能是多个,中间用空格分隔显示,比如 ["code","name"]-> "001 财政"
valueProperty:'', //一般是id或者code
all:false, //是否显示全部按钮
value:[],
maxSize:5,
$dom:''
}
$.extend(defaults,conf);
this.defaults = defaults;
this.$dom = this.defaults.$dom || $("#"+this.defaults.id); //如何$dom有值,则直接用,否则用id去找
if(defaults.value.length>defaults.maxSize){
this.showSize = defaults.maxSize;
this.more= true;
}else{
this.showSize = defaults.value.length;
}
if(defaults.all){
me.$dom.append("<option value='-1'>全部</option>");
}
for(var i=0;i<this.showSize;i++){
var tempValue = defaults.value[i];
var optionContent = "";
var optionVal = tempValue[defaults.valueProperty];
for(var j=0;j<defaults.showProperty.length;j++){
var key = defaults.showProperty[j];
var opEle = tempValue[key];
optionContent += opEle+" ";
}
me.$dom.append("<option value='"+optionVal+"'>"+optionContent+"</option>");
}
if(this.more){
me.$dom.append("<option value=''>更多...</option>");
}
//弹出框--点击事件
me.$dom.on('change',function(){
var selectedText = me.$dom.find("option:selected").text();
if(selectedText != "更多..."){
return;
}
//选择第一项..
var $panel = $("<div></div>");
//添加搜索框
var $searcher = me.makeSearcher();
var $content = $("<div></div>");
$searcher.find('input').on('input',function(){
me.refreshContent($searcher,$content);
return false;
});
$panel.append($searcher);
me.refreshContent($searcher,$content);
$panel.append($content);
//弹出框调用...大同小异
me.DivWindow = new DivWindow({
content:$panel,
title:'选择框',
width:700
});
});
//=========================画弹出框中的每一个item===是一个带圆角的矩形.
this.makeRecTangle = function(conf){
var me = this;
var defaults = {
css:{
width:"150px",
height:"30px",
background:'#aaccdd',
margin:'10px 20px',
pading:'10px 20px',
"text-align":'center',
"font-weight":'bold',
"font-size":'larger',
border: "5px solid #dedede",
"-moz-border-radius": "15px", /* Gecko browsers */
"-webkit-border-radius": "15px", /* Webkit browsers */
"border-radius":"15px", /* W3C syntax */
cursor:'pointer',
float:'left'
},
text:'hello,world',
value:'1'
}
$.extend(defaults,conf);
var $recTangle = $('<div>'+defaults.text+'</div>');
$recTangle.css(defaults.css);
$recTangle.on('mouseover',function(){
$recTangle.css("border","5px solid green");
}).on('mouseout',function(){
$recTangle.css("border",defaults.css.border);
});
$recTangle.attr("value",defaults.value);
$recTangle.on('dblclick',function(){
//关闭divWin,并将value和text值返回
me.DivWindow.close();
me.$dom.val(defaults.value);
if(me.defaults.all){//如果有全部的话,放在第二项,因为第一项是全部
me.$dom.get(0).options[1].text =defaults.text;
me.$dom.get(0).options[1].value =defaults.value;
me.$dom.get(0).options[1].selected =true;
}else{ //没有全部的话,直接放在第一项,默认选中..
me.$dom.get(0).options[0].text =defaults.text;
me.$dom.get(0).options[0].value =defaults.value;
me.$dom.get(0).options[0].selected =true;
}
//-----一定要触发一下change事件
me.$dom.trigger('change');
});
return $recTangle;
}
//===================搜索框=====空时搜索全部
this.makeSearcher = function(){
var $searcher = $(' <form class="pure-form" style="width:400px;margin:0px auto 10px auto;">'
+'<input placeholder="输入搜索字符串(双击选择)" style="width:400px;">'
+'</form> ');
return $searcher;
}
//=====根据搜索框中的内容,来显示$content中的小矩形item..
this.refreshContent = function($searcher,$content){
var me = this;
$content.empty();
var value = $searcher.find('input').val();
for(var i=0;i<this.defaults.value.length;i++){
var temp = this.defaults.value[i];
//用显示的字符串进行搜索->
var properties = this.defaults.showProperty;
for(var j=0;j<properties.length;j++){
var realValue = temp[properties[j]];
if(realValue.indexOf(value)>=0 || !value){
//说明有这个..
var valueAndText = me.getValueAndText(temp);
$content.append(me.makeRecTangle(valueAndText));
break;
}
}
}
}
this.getValueAndText = function(obj){
var text = "";
var properties = this.defaults.showProperty;
var valueProperty = this.defaults.valueProperty;
for(var i=0;i<properties.length;i++){
text += obj[properties[i]]+" ";
}
var value = obj[valueProperty];
return {
text:text,
value:value
};
}
}
}
调用
html
<select id="selectRegion"></select>
js
直接new
$.ajax({
url : '.....do',
type : "post",
data : {},
success : function(result){
new Com.SelectMore({
id:'selectRegion',
showProperty:['region_code','region_name'],
valueProperty:'region_code',
value:result.region
});
}
});