在Select2 MultiSelect下拉列表中添加自定义标签样式

时间:2017-04-25 10:10:08

标签: javascript jquery jquery-select2

所以我正在使用Select2 4库(https://select2.github.io/),我遇到了问题。

<select id="test" multiple style="width:800px;">
    <option value="a">aaaaa</option>
    <option value="b">bbbbb</option>
    <option value="c">cccc</option>
    <option value="d">ddddd</option>
</select>

(...)

$("#test").select2({
   tags: true,
   tokenSeparators: [',', ' ']
})

这是在做出一些选择DOM元素之后生成的,其中包含一些<li> s

所以 - 它运作正常。但我需要在更改后将我的类添加到<li>个元素中。我不知道怎么做,因为Select2在添加后会立即重写我的课程。

我尝试过这样的事情:

selectEl.change(function() {
  var elements = $('.select2-selection > ul > li');
  elements.each(function() {
    $(this).addClass('my-test-class');
  });
});

但没有任何变化(除了最后一个元素,这是一个输入)。我的意思是 - 我认为它有效,但Select2立即重写它。

我尝试过使用change,select2:select listeners,但没有一个能正常工作。

这个想法是 - 将“select2-auto”添加到从下拉列表中选择的<li>,将“select-manual”类添加到其他列。

3 个答案:

答案 0 :(得分:2)

您可以将templateSelection:用于自定义标记样式,请在下面的代码段中找到以供参考..

templateSelection: function(selection) {
        if(selection.selected) {
            return $.parseHTML('<span class="customclass">' + selection.text + '</span>');
        }
        else {
            return $.parseHTML('<span class="customclass">' + selection.text + '</span>');
        }
    }

$("#test").select2({
   tags: true,
   allowClear: true, //
   closeOnSelect: false,
   tokenSeparators: [',', ' '],
   templateSelection: function(selection) {
        if(selection.selected) {
            return $.parseHTML('<span class="customclass">' + selection.text + '</span>');
        }
        else {
            return $.parseHTML('<span class="customclass">' + selection.text + '</span>');
        }
    }

});

$("#test").on("select2:select", function(e) { 
$("li[aria-selected='true']").addClass("customclass");
$("li[aria-selected='false']").removeClass("customclass");
$('.select2-search-choice:not(.my-custom-css)', this).addClass('my-custom-css');
});

$("#test").on("select2:unselect", function(e) { 
$("li[aria-selected='false']").removeClass("customclass");
});
.selectRow {
    display : block;
    padding : 20px;
}
.select2-container {
    width: 200px;
}

.customclass
{
  color:red;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css" rel="stylesheet"/>
<select id="test" multiple style="width:800px;">
    <option value="a">aaaaa</option>
    <option value="b">bbbbb</option>
    <option value="c">cccc</option>
    <option value="d">ddddd</option>
</select>

答案 1 :(得分:0)

dropdownCssClass用于将类添加到select2下拉菜单的属性。像这样的东西,

$("#test").select2({
     tags: true,
     tokenSeparators: [',', ' '],
     containerCssClass: "my-test-class",
     dropdownCssClass: "test-class"
 });

我希望这对你有用。感谢。

答案 2 :(得分:0)

$("#test").select2({
   tags: true,
   allowClear: true, //
   closeOnSelect: false,
   tokenSeparators: [',', ' ']
});

$("#test").on({
  "select2:select": function(e) { 
      $("li[aria-selected='true']").addClass("customclass");
      $("li[aria-selected='false']").removeClass("customclass");
    },
    "select2:opening": function(e) { 
        setTimeout(function(){
          $("li[aria-selected='true']").addClass("customclass");
          $("li[aria-selected='false']").removeClass("customclass");
        },0)
    },
    "select2:unselect" : function(e) { 
        $("li[aria-selected='false']").removeClass("customclass");
    }
});
.selectRow {
      display : block;
      padding : 20px;
  }
  .select2-container {
      width: 200px;
  }

  .customclass
  {
    color:red;
  }
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.full.min.js"></script>


<select id="test" multiple style="width:800px;">
    <option value="a">aaaaa</option>
    <option value="b">bbbbb</option>
    <option value="c">cccc</option>
    <option value="d">ddddd</option>
</select>