从slect2.js标签中的选项中获取类

时间:2015-10-25 10:44:25

标签: jquery css jquery-select2 jquery-select2-4

我正在使用带有以下代码的select2.js库,我希望将所有类从options标签添加到select2列表,例如<li class="active select2-selection__choice" title="AA"><span ...

<select id="example" multiple="multiple" style="width:100%">
<option value="AA" class="active" selected>AA</option>
<option value="BB" class="stanby" selected>BB</option>
<option value="CC"class="active" selected>CC</option>

$("#example").select2();

Here是可以使用的小提琴。

enter image description here

1 个答案:

答案 0 :(得分:1)

这可以通过提供自定义selectionAdapter选项来实现。我基于MultipleSelection的Select2实现创建了一个。

// create our custom selection adapter by extending the select2 default one
$.fn.select2.amd.define('select2-ClassPreservingMultipleSelection',[
    'jquery',
    'select2/selection/multiple',
    'select2/utils'
], function ($, MultipleSelection, Utils) {
    function ClassPreservingMultipleSelection ($element, options) {
        ClassPreservingMultipleSelection.__super__.constructor.apply(this, arguments);
    }

    Utils.Extend(ClassPreservingMultipleSelection, MultipleSelection);

    // this function was changed to propagate the `selection` argument
    ClassPreservingMultipleSelection.prototype.selectionContainer = function (selection) {
        var $baseContainer = ClassPreservingMultipleSelection.__super__.selectionContainer.apply(this, arguments);

        // this line is what actually adds your CSS-classes
        return $baseContainer.addClass(selection.element.className);
    };

    // this is a copy-paste of the base method with only one line changed
    ClassPreservingMultipleSelection.prototype.update = function (data) {
        this.clear();

        if (data.length === 0) {
            return;
        }

        var $selections = [];

        for (var d = 0; d < data.length; d++) {
            var selection = data[d];

            // This is the only changed line in this method - we added the 'selection' propagation
            var $selection = this.selectionContainer(selection);
            var formatted = this.display(selection, $selection);

            $selection.append(formatted);
            $selection.prop('title', selection.title || selection.text);

            $selection.data('data', selection);

            $selections.push($selection);
        }

        var $rendered = this.$selection.find('.select2-selection__rendered');

        Utils.appendMany($rendered, $selections);
        console.log($rendered.html());
    };

    return ClassPreservingMultipleSelection;
});

$("#example").select2({
    selectionAdapter: $.fn.select2.amd.require('select2-ClassPreservingMultipleSelection')
});

这是updated JsFiddle给你的。