扩展select下拉框,(当数据过多的时候以弹出框的形式显示)

扩展select下拉框,(当数据过多的时候以弹出框的形式显示)

扩展select下拉框,(当数据过多的时候以弹出框的形式显示)

问题描述:

  • 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
                });
        }
});

Created: 2016-05-05 周四 12:54

Emacs 24.5.1 (Org mode 8.2.10)

Validate

posted @ 2016-05-05 12:52  刘振宁的博客  阅读(10038)  评论(0编辑  收藏  举报