jq多選下拉框

multipleSelect.png

html里的內(nèi)容(manage.html中使用select) 別忘了導入下面的multiple-select.js和multiple-select.css

<select class="selectJl" name="selectJl" multiple="multiple">

使用多選框的一些方法如下

渲染所有選項

var jlData = data.rows //接口返回的選項數(shù)據(jù)

let html = ''

$('.selectJl').empty()

jlData.forEach((m) => {

    html += `<option value="${m.id}">${m.code}</option>`

})

$('.selectJl').append(html)

$(".selectJl").fSelect();

獲取已選中的選項

$('.fs-options').find(".fs-option").removeClass('selected')

const ids = data.rows.map((m) => {

return m.id

})

$('.fs-option').each(function (){

const id =$(this).attr('data-value')

if(ids.includes(id)){

$(this).addClass('selected')

}

})

$('.selectJl').fSelect('reloadDropdownLabel')

清空所有選項

$('.fs-options').find(".fs-option").removeClass('selected')

$('.selectJl').fSelect('reloadDropdownLabel')

勾選了所有選項的id數(shù)組

let ids = []
$('.fs-option.selected').each(function (i, el) {
    ids.push($(el).attr('data-value'))
})

多選框js的內(nèi)容(multiple-select.js)

(function($) {

    $.fn.fSelect = function(options) {

        if (typeof options == 'string' ) {
            var settings = options;
        }
        else {
            //默認配置項
            var settings = $.extend({
                placeholder:  ' 請選擇 ',//占位符,默認顯示什么
                numDisplayed:30,//設(shè)置頁面上可以顯示幾個選項(超出這個數(shù)量將會顯示選擇了n項)
                overflowText: '選擇了{n}項',//超出這個數(shù)量將會顯示"選擇了n項"
                searchText: '搜索',//搜索框中占位符顯示什么字
                showSearch: true//是否顯示搜索框
            }, options);
        }


        /**
         * Constructor
         */
        function fSelect(select, settings) {
            this.$select = $(select);
            this.settings = settings;
            this.create();
        }


        /**
         * Prototype class
         */
        fSelect.prototype = {
            create: function() {
                var multiple = this.$select.is('[multiple]') ? ' multiple' : '';
                this.$select.wrap('<div class="fs-wrap' + multiple + '"></div>');
                this.$select.before('<div class="fs-label-wrap"><div class="fs-label">' + this.settings.placeholder + '</div><span class="fs-arrow"></span></div>');
                this.$select.before('<div class="fs-dropdown hidden"><div class="fs-options"></div></div>');
                // this.$select.addClass('hidden');
                this.$select.addClass('visibility-hidden');
                this.$wrap = this.$select.closest('.fs-wrap');
                //添加全選和清空按鈕
                var BtnFixed = '<div class="btnFixed"><button class="buttonDefault" id="selectAllBtn" type="button">全選</button><button class="buttonDefault" id="clearAllBtn" type="button">清空</button></div>';
                this.$wrap.find('.fs-dropdown').append(BtnFixed);
                this.reload();
            },

            reload: function() {
                //如果設(shè)置顯示搜索框们颜,執(zhí)行下面方法
                if (this.settings.showSearch) {
                    var search = '<div class="fs-search"><input type="search" placeholder="' + this.settings.searchText + '" /></div>';
                    this.$wrap.find('.fs-dropdown').prepend(search);
                }
                var choices = this.buildOptions(this.$select);
                //獲取到所有option選項
                this.$wrap.find('.fs-options').append(choices);

                //選中當前已選的值
                var valArr = this.$select.val();
                // if(valArr.length){
                if(valArr){
                    var $fsOption = this.$wrap.find('.fs-option');
                    valArr.forEach(function(currentValue){
                        $fsOption.each(function(){
                            if(currentValue == $(this).attr('data-value')){
                                $(this).addClass("selected");
                            }
                        });
                    });
                }
                //獲取到選中狀態(tài)的選項
                this.reloadDropdownLabel();
            },

            destroy: function() {
                this.$wrap.find('.fs-label-wrap').remove();
                this.$wrap.find('.fs-dropdown').remove();
                // this.$select.unwrap().removeClass('hidden');
                this.$select.unwrap().removeClass('visibility-hidden');
            },
            //獲取select的option選項姓赤,并賦值到插件自定義的每一選項div里
            buildOptions: function($element) {
                var $this = this;

                var choices = '';
                $element.children().each(function(i, el) {
                    var $el = $(el);
                    //支持 optiongroup
                    if ('optgroup' == $el.prop('nodeName').toLowerCase()) {
                        choices += '<div class="fs-optgroup">';
                        choices += '<div class="fs-optgroup-label">' + $el.prop('label') + '</div>';
                        choices += $this.buildOptions($el);
                        choices += '</div>';
                    }
                    else {
                        var selected = $el.is('[selected]') ? ' selected' : '';
                        choices += '<div class="fs-option' + selected + '" data-value="' + $el.prop('value') + '"><span class="fs-checkbox"><i></i></span><div class="fs-option-label">' + $el.html() + '</div></div>';
                    }
                });

                return choices;
            },
            //每次加載時判斷一下插件自定義的每一選項div哪些是選中狀態(tài),將選中狀態(tài)對應的文字獲,push到一個數(shù)組labelText里沟启,頁面上顯示出來的文字就是數(shù)組中取到的文字
            reloadDropdownLabel: function() {
                var settings = this.settings;
                var labelText = [];

                this.$wrap.find('.fs-option.selected').each(function(i, el) {
                    labelText.push($(el).find('.fs-option-label').text());
                });

                if (labelText.length < 1) {
                    labelText = settings.placeholder;
                }
                else if (labelText.length > settings.numDisplayed) {
                    labelText = settings.overflowText.replace('{n}', labelText.length);
                }
                else {
                    labelText = labelText.join(', ');
                }

                this.$wrap.find('.fs-label').html(labelText);
                this.$wrap.find('.fs-label').attr("title",labelText);
                this.$select.change();
            }
        }


        /**
         * Loop through each matching element
         */
        return this.each(function() {
            var data = $(this).data('fSelect');

            if (!data) {
                data = new fSelect(this, settings);
                $(this).data('fSelect', data);
            }

            if (typeof settings == 'string') {
                data[settings]();
            }
        });
    }
    /**
     * Events
     */
    window.fSelect = {
        'active': null,
        'idx': -1
    };

    function setIndexes($wrap) {
        $wrap.find('.fs-option:not(.hidden)').each(function(i, el) {
            $(el).attr('data-index', i);
            $wrap.find('.fs-option').removeClass('hl');
        });
        $wrap.find('.fs-search input').focus();
        window.fSelect.idx = -1;
    }

    function setScroll($wrap) {
        var $container = $wrap.find('.fs-options');
        var $selected = $wrap.find('.fs-option.hl');

        var itemMin = $selected.offset().top + $container.scrollTop();
        var itemMax = itemMin + $selected.outerHeight();
        var containerMin = $container.offset().top + $container.scrollTop();
        var containerMax = containerMin + $container.outerHeight();

        if (itemMax > containerMax) { // scroll down
            var to = $container.scrollTop() + itemMax - containerMax;
            $container.scrollTop(to);
        }
        else if (itemMin < containerMin) { // scroll up
            var to = $container.scrollTop() - containerMin - itemMin;
            $container.scrollTop(to);
        }
    }
    //插件選項的點擊事件
    $(document).on('click', '.fs-option', function() {
        var $wrap = $(this).closest('.fs-wrap');

        if ($wrap.hasClass('multiple')) {
            var selected = [];

            $(this).toggleClass('selected');
            $wrap.find('.fs-option.selected').each(function(i, el) {
                selected.push($(el).attr('data-value'));
            });
        }
        else {
            var selected = $(this).attr('data-value');
            $wrap.find('.fs-option').removeClass('selected');
            $(this).addClass('selected');
            $wrap.find('.fs-dropdown').hide();
        }
        $wrap.find('select').val(selected);
        $wrap.find('select').fSelect('reloadDropdownLabel');
    });

    $(document).on('keyup', '.fs-search input', function(e) {
        if (40 == e.which) {
            $(this).blur();
            return;
        }

        var $wrap = $(this).closest('.fs-wrap');
        var keywords = $(this).val();

        $wrap.find('.fs-option, .fs-optgroup-label').removeClass('hidden');

        if ('' != keywords) {
            $wrap.find('.fs-option').each(function() {
                var regex = new RegExp(keywords, 'gi');
                if (null === $(this).find('.fs-option-label').text().match(regex)) {
                    $(this).addClass('hidden');
                }
            });

            $wrap.find('.fs-optgroup-label').each(function() {
                var num_visible = $(this).closest('.fs-optgroup').find('.fs-option:not(.hidden)').length;
                if (num_visible < 1) {
                    $(this).addClass('hidden');
                }
            });
        }

        setIndexes($wrap);
    });
    //顯示隱藏下拉選項
    $(document).on('click', function(e) {
        var $el = $(e.target);
        var $wrap = $el.closest('.fs-wrap');

        if (0 < $wrap.length) {
            if ($el.hasClass('fs-label')) {
                window.fSelect.active = $wrap;
                var is_hidden = $wrap.find('.fs-dropdown').hasClass('hidden');
                $('.fs-dropdown').addClass('hidden');

                if (is_hidden) {
                    $wrap.find('.fs-dropdown').removeClass('hidden');
                }
                else {
                    $wrap.find('.fs-dropdown').addClass('hidden');
                }

                setIndexes($wrap);
            }
        }
        else {
            $('.fs-dropdown').addClass('hidden');
            window.fSelect.active = null;
        }
    });

    $(document).on('keydown', function(e) {
        var $wrap = window.fSelect.active;

        if (null === $wrap) {
            return;
        }
        else if (38 == e.which) { // up
            e.preventDefault();

            $wrap.find('.fs-option').removeClass('hl');

            if (window.fSelect.idx > 0) {
                window.fSelect.idx--;
                $wrap.find('.fs-option[data-index=' + window.fSelect.idx + ']').addClass('hl');
                setScroll($wrap);
            }
            else {
                window.fSelect.idx = -1;
                $wrap.find('.fs-search input').focus();
            }
        }
        else if (40 == e.which) { // down
            e.preventDefault();

            var last_index = $wrap.find('.fs-option:last').attr('data-index');
            if (window.fSelect.idx < parseInt(last_index)) {
                window.fSelect.idx++;
                $wrap.find('.fs-option').removeClass('hl');
                $wrap.find('.fs-option[data-index=' + window.fSelect.idx + ']').addClass('hl');
                setScroll($wrap);
            }
        }
        else if (32 == e.which || 13 == e.which) { // space, enter
            $wrap.find('.fs-option.hl').click();
        }
        else if (27 == e.which) { // esc
            $('.fs-dropdown').addClass('hidden');
            window.fSelect.active = null;
        }
    });

    //=========================全選=====================================
    $(document).on('click','#selectAllBtn', function( ) {
        var $wrap = $(this).closest('.fs-wrap');

        if ($wrap.hasClass('multiple')) {
            var selected = [];

            $wrap.find(".fs-option").addClass('selected');
            $wrap.find('.fs-option.selected').each(function(i, el) {
                selected.push($(el).attr('data-value'));
            });
        }
        $wrap.find('select').val(selected);
        $wrap.find('select').fSelect('reloadDropdownLabel');
    });
    //=========================全不選/清空=====================================
    $(document).on('click','#clearAllBtn', function( ) {
        var $wrap = $(this).closest('.fs-wrap');

        if ($wrap.hasClass('multiple')) {
            var selected = [];

            $wrap.find(".fs-option").removeClass('selected');
            $wrap.find('.fs-option.selected').each(function(i, el) {
                selected.push($(el).attr('data-value'));
            });
        }
        $wrap.find('select').val(selected);
        $wrap.find('select').fSelect('reloadDropdownLabel');
    });

})(jQuery);

多選框style的內(nèi)容(multiple-select.css)

.fs-wrap {
    position: relative;
    display: inline-block;
    width: 200px;
    font-size: 12px;
    line-height: 1;
}

.fs-label-wrap {
    position: relative;
    border: 1px solid #ddd;
    cursor: default;
}

.fs-label-wrap,
.fs-dropdown {
    -webkit-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
}

.fs-label-wrap .fs-label {
    padding: 4px 22px 4px 8px;
    text-overflow: ellipsis;
    white-space: nowrap;
    overflow: hidden;
}

.fs-arrow {
    width: 0;
    height: 0;
    border-left: 6px solid transparent;
    border-right: 6px solid transparent;
    border-top: 6px solid #000;
    position: absolute;
    top: 0;
    right: 5px;
    bottom: 0;
    margin: auto;
}

.fs-dropdown {
    position: absolute;
    background-color: #fff;
    border: 1px solid #ccc;
    margin-top: 5px;
    width: 100%;
    z-index: 1000;
}

.fs-dropdown .fs-options {
    max-height: 200px;
    overflow: auto;
}

.fs-search input {
    width: 100%;
    padding: 2px 4px;
    border: 0;
}

.fs-option,
.fs-search,
.fs-optgroup-label {
    padding: 6px 8px;
    border-bottom: 1px solid #eee;
    cursor: default;
}

.fs-option {
    cursor: pointer;
}

.fs-option.hl {
    background-color: #f5f5f5;
}

.fs-wrap.multiple .fs-option {
    position: relative;
    padding-left: 30px;
}

.fs-wrap.multiple .fs-checkbox {
    position: absolute;
    display: block;
    width: 30px;
    top: 0;
    left: 0;
    bottom: 0;
}

.fs-wrap.multiple .fs-option .fs-checkbox i {
    position: absolute;
    margin: auto;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    width: 14px;
    height: 14px;
    border: 1px solid #aeaeae;
    border-radius: 2px;
    background-color: #fff;
}

.fs-wrap.multiple .fs-option.selected .fs-checkbox i {
    background-color: rgb(17, 169, 17);
    border-color: transparent;
    background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAGCAYAAAD+Bd/7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNXG14zYAAABMSURBVAiZfc0xDkAAFIPhd2Kr1WRjcAExuIgzGUTIZ/AkImjSofnbNBAfHvzAHjOKNzhiQ42IDFXCDivaaxAJd0xYshT3QqBxqnxeHvhunpu23xnmAAAAAElFTkSuQmCC');
    background-repeat: no-repeat;
    background-position: center;
}

.fs-wrap .fs-option:hover {
    background-color: #f5f5f5;
}

.fs-optgroup-label {
    font-weight: bold;
}

.hidden {
    display: none;
}


/*根據(jù)本項目自定義修改*/
.visibility-hidden {
    display: block;
    visibility: hidden;
    position: absolute;
    top: 0;
}

.deptWrap, .fs-wrap, .fs-label-wrap {
    width: 218px;
    height: 30px;
    border-radius: 2px;

    border-color: #777;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
}

.fs-wrap {
    position: relative
}

.fs-label-wrap .fs-label {
    padding: 0;
    height: 30px;
    line-height: 30px;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    padding-left: 6px;
    padding-right: 10px;
}

.btnFixed {
    height: 28px;
    text-align: center;
}

.btnFixed > .buttonDefault {
    width: 60px;
    height: 24px;
    background: rgb(86, 148, 254);
    border: none;
    margin-left: 10px;
    color: #fff;
    margin-top: 2px;
    border-radius: 4px;
}

.btnFixed > .buttonDefault:hover {
    background: rgb(181, 226, 254);
    color: #4284f5;
}

.fs-search {
    padding: 2px 8px;
}

.fs-dropdown {
    margin-top: 0px;
    box-shadow: 4px 4px 4px #ddd;
}

.fs-wrap.multiple .fs-option.selected .fs-checkbox i {
    background-color: rgb(86, 148, 254);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末三娩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子抑钟,更是在濱河造成了極大的恐慌涯曲,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件在塔,死亡現(xiàn)場離奇詭異幻件,居然都是意外死亡,警方通過查閱死者的電腦和手機蛔溃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門绰沥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人贺待,你說我怎么就攤上這事徽曲。” “怎么了麸塞?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵秃臣,是天一觀的道長。 經(jīng)常有香客問我,道長奥此,這世上最難降的妖魔是什么弧哎? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮稚虎,結(jié)果婚禮上撤嫩,老公的妹妹穿的比我還像新娘。我一直安慰自己蠢终,他們只是感情好序攘,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蜕径,像睡著了一般两踏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兜喻,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天梦染,我揣著相機與錄音,去河邊找鬼朴皆。 笑死帕识,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的遂铡。 我是一名探鬼主播肮疗,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼扒接!你這毒婦竟也來了伪货?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤钾怔,失蹤者是張志新(化名)和其女友劉穎碱呼,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宗侦,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡愚臀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了矾利。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姑裂。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖男旗,靈堂內(nèi)的尸體忽然破棺而出舶斧,到底是詐尸還是另有隱情,我是刑警寧澤剑肯,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布捧毛,位于F島的核電站,受9級特大地震影響让网,放射性物質(zhì)發(fā)生泄漏呀忧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一溃睹、第九天 我趴在偏房一處隱蔽的房頂上張望而账。 院中可真熱鬧,春花似錦因篇、人聲如沸泞辐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咐吼。三九已至,卻和暖如春商佑,著一層夾襖步出監(jiān)牢的瞬間锯茄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工茶没, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肌幽,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓抓半,卻偏偏與公主長得像喂急,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子笛求,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容