Skip to content

lizenghua/selectDialog

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

selectDialog

select带选择搜索的弹窗效果

预览

核心逻辑

/**
/* 弹窗选择插件
 * 依赖组件 :jquery artDialog bootstrap
 * 使用方式 :$('#id').selectDialog({配置项});
 * 取值方式 :$('#id').val();
 * 可用配置项 :弹窗的宽:width, 弹窗的高:height, 弹窗的标题:title, 确定按钮的文字:okVal,关闭按钮的文字:cancelVal, 无选择时显示的文字:emptyText
 */
;(function($) {
    $.fn.selectDialog=function(options) {
        var defaults= {
            width: 800, height: 'auto', title: '选择', okValue: '保存', cancelValue: '取消', emptyText: ''
        }
        var options=$.extend(defaults, options);
        var values=[];
        var optionText=[];
        var select=this;
        var module='';
        if(select.attr('multiple')==='multiple') {
            //多选
            module='multiple';
        }
        else {
            module='single';
        }
        options.selected=[]; //选中的行
        options.emptyText=options.emptyText?options.emptyText: select.attr('placeholder'); //无选择时显示的文字
        select.find('option').each(function(index, value) {
            var v=$(value).attr('value');
            if($(value).attr('selected')==="selected") {
                options.selected.push(v);
            }
            values.push(v);
            optionText.push($(value).text());
        }
        );
        var id=select.attr('id');
        var warpId=id + '-selectDialogWarp';
        var contentId=id + '-content';
        var dialogId=id + '-dialogId';
        var open_dialog=function() {
            var d=dialog( {
                okValue: options.okValue,
                cancelValue: options.cancelValue,
                title: options.title, width: options.width, height: options.height, lock: true, content: creat_content(optionText), ok: function() {
                    $(document).unbind('keydown');
                    creat_warp_content();
                    //点保存以后,设置select值
                    select.find('option').each(function(index, value) {
                        var option=$(value), v=option.attr('value');
                        if($.inArray(v, options.selected)===-1) {
                            option.removeAttr('selected');
                        }
                        else {
                            option.attr('selected', 'selected')
                        }
                    }
                    );
                    select.trigger('change');
                }
                , onshow: function() {
                    //对话框弹出时执行的函数
                    $(".ui-dialog-body").css('vertical-align', 'top');
                    $(".ui-dialog-body").css('text-align', 'left');
                    $(".ui-dialog-content .btn-toolbar .btn").click(function() {
                        //绑定按钮点击事件
                        btnClick(this);
                    }
                    );
                    $(".ui-dialog-content").find('button[data-id="check_all"]').click(function() {
                        check_all();
                    }
                    );
                    $(".ui-dialog-content").find('button[data-id="inverse"]').click(function() {
                        inverse();
                    }
                    );
                    $(document).keyup(function(event) {
                        if(event.keyCode==27) {
                            d.close();
                        }
                    }
                    );
                    //过滤
                    $('input[data-id="keyword"]').bind('keyup', filter);
                    //如果是单选,隐藏全选和反选
                    if(module==='single') {
                        $('#'+dialogId).find('div[data-id="btn-group"]').hide();
                    }
                }
                , okVal: options.okVal, cancel: function() {
                    $(".ui-dialog-body").css('vertical-align', 'middle');
                    $(".ui-dialog-body").css('text-align', 'center');
                    $(".ui-dialog-close").trigger('mouseout');
                    $(document).unbind('keydown');
                }
                , cancelVal: options.cancelVal
            });
            d.showModal();
        }
        var check_all=function() {
            $(".ui-dialog-content .btn-toolbar .btn").each(function() {
                var v=values[parseInt($(this).attr('data-index'))];
                if(v && !$(this).is(':hidden')) {
                    add(v);
                    $(this).addClass('btn-primary');
                }
            }
            );
        }
        var inverse=function() {
            $(".ui-dialog-content .btn-toolbar .btn").each(function() {
                if(!$(this).is(':hidden'))$(this).trigger('click');
            }
            );
            //反选后执行一次过滤操作
            $('input[data-id="keyword"]').trigger('keyup');
        }
        var btnClick=function (btn) {
            var btn=$(btn);
            var value=values[parseInt(btn.attr('data-index'))];
            if(btn.hasClass('btn-primary')) {
                btn.removeClass('btn-primary');
                remove(value);
            }
            else {
                //单选模式下,取消其他选中的
                if(module==='single') {
                    $('#'+ contentId + ' .btn-primary').each(function(index, v) {
                        $(v).trigger('click');
                    }
                    );
                }
                btn.addClass('btn-primary');
                add(value);
            }
        }
        var add=function(v) {
            if($.inArray(v, options.selected)===-1) {
                options.selected.push(v);
            }
        }
        var remove=function(v) {
            var key=$.inArray(v, options.selected);
            options.selected.splice(key, 1);
        }
        var creat_warp_content=function() {
            var content='<div class="btn-toolbar">';
            if(options.selected.length===0 && options.emptyText) {
                content +='<span style="color:#999999;">'+ options.emptyText +'</span>'
            }
            else {
                $.each(options.selected, function(index, v) {
                    var key=$.inArray(v, values);
                    var value=optionText[key];
                    if(value) {
                        content +='<div class="btn-group"><a class="btn btn-primary btn-xs" data="'+v+'">'+ value +'</a><button type="button" class="u-btn-close btn btn-primary btn-xs dropdown-toggle"><span></span></button></div>';
                    }
                }
                );
            }
            content +='</div>';
            $('#'+warpId).html(content);
            $('.u-btn-close').on('click',function (){
                var closeIndex=optionText.indexOf($(this).siblings('a').text());
                $(this).parent().remove();
                select.find('option').eq(closeIndex).removeAttr('selected');
                var _closeIndex=options.selected.indexOf(select.find('option').eq(closeIndex).val());
                options.selected.splice(_closeIndex,1);
                return false;
            })
        }
        ;
        var creat_content=function(data) {
            var toolbar='<div class="container-fluid"><div class="row" style="height:44px;" id="'+ dialogId +'">'+ '<div class="col-xs-8" style="padding:0;">'+ '<div class="btn-group btn-group-sm" data-id="btn-group" style="margin-bottom: 10px;">'+ '<button class="btn btn-primary" data-id="check_all">全选</button>'+ '<button class="btn btn-success" data-id="inverse">反选</button>'+ '</div>'+ '</div>'+ '<div class="col-xs-4" style="padding:0;">'+ '<input type="text" data-id="keyword" placeholder="搜索..." style="float: right;margin-top:  7px;margin-right: 6px;width:200px;">'+ '</div>'+ '</div></div>';
            var content=toolbar+'<div class="btn-toolbar" id='+ contentId +' style="width:700px;">';
            $.each(data, function(index, v) {
                var default_class='btn';
                if($.inArray(values[index], options.selected) > -1) {
                    default_class +=' btn-primary'
                }
                content +='<div class="btn-group btn-group-sm"><button class="'+ default_class +'" data-index="'+index+'" data-text="'+ v.toLowerCase() +'">'+ v +'</button></div>';
            }
            );
            content +='</div>';
            return content;
        }
        var filter=function(event) {
            var input=$(event.target), key=input.val().toLowerCase(), content=$('#'+contentId);
            if(key=='') {
                content.find('button').show();
            }
            else {
                var buttons=content.find('button:not([data-text*="'+ key +'"]):not(.btn-primary)');
                content.find('button').show(); //避免输入中文时的bug
                buttons.hide();
            }
        }
        this.each(function() {
            $(this).hide();
            if($('#'+warpId).length>0) {
                //如果存在,清空内容
                $('#'+warpId).html('').off('click');
            }
            else {
                $(this).after('<div class="form-control" id="'+warpId+'" style="min-height:37px;height:auto;cursor: pointer;"></div>');
            }
            creat_warp_content();
            $('#'+warpId).click(function() {
                open_dialog(options);
            }
            );
        }
        );
        return this;
    }
})(jQuery);

About

select带选择搜索的弹窗效果

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published