如何在下拉框下方的Select2中显示选中的标签?

How do I display the selected tags in Select2 below the dropdown box?

我正在使用带标签的 Select2(版本 4),并希望在输入字段下方显示所选选项。

所以代替:

宁愿拥有:

这可能吗?如果可以,我该如何实现?

编辑: 代码是:

<select class="js-example-tags form-control" multiple="multiple">
    <option selected="selected">orange</option>
    <option selected="selected">white</option>
    <option selected="selected">purple</option>
    <option selected="selected">red</option>
    <option selected="selected">blue</option>
    <option selected="selected">green</option>
</select>

$(".js-example-tags").select2({
tags: true
})

渲染元素时,会为元素添加带有 class 的 ul。这个 class 名字是:select2-selection__rendered 所以我的想法是在它被渲染之后,我可以拿这个 class 并添加一些底部。为此,我使用 JQuery 使用 $(function() 请注意,这是在加载所有内容后加载,因此对于您需要的 javascript 代码,如下(已测试):

Javascript代码:

  <script>
  $(".js-example-tags").select2({
   tags: true
  });

   $(function() {
      //Here you add the bottom pixels you need. I added 200px.
      $('.select2-selection__rendered').css({top:'200px',position:'relative'});
   });
  </script>

我似乎无法对所选答案发表评论...但是如果您在页面上有多个 select2 并且只想对一个进行此操作,那该怎么办呢?有没有可靠的方法来识别一个与所有的?

几周前我遇到了这个问题,我想分享一个替代解决方案,我认为它比其他答案所需的对 Select2 的一些样式修改风险更小。

我们的团队最终使用的是一个脚本,它侦听底层 <select> 元素的 change 事件到 build/rebuild 兄弟元素中的样式化无序列表:

$(".js-example-tags").select2({
    tags: true
}).on('change', function() {
    var $selected = $(this).find('option:selected');
    var $container = $(this).siblings('.js-example-tags-container');

    var $list = $('<ul>');
    $selected.each(function(k, v) {
       var $li = $('<li class="tag-selected"><a class="destroy-tag-selected">×</a>' + $(v).text() + '</li>');
       $list.append($li);
    });
    $container.html('').append($list);
}).trigger('change');

而且,除了 select2 标签的出现之外,为了给新列表提供功能,我们监听了一个 click 事件,并将每个列表项与 option 中的相应 option 配对=13=] 这样它就可以切换选定状态并再次触发 change 事件:

$selected.each(function(k, v) {
    var $li = $('<li class="tag-selected"><a class="destroy-tag-selected">×</a>' + $(v).text() + '</li>');
    $li.children('a.destroy-tag-selected')
        .off('click.select2-copy')
        .on('click.select2-copy', function(e) {
              var $opt = $(this).data('select2-opt');
              $opt.attr('selected', false);
              $opt.parents('select').trigger('change');
        }).data('select2-opt', $(v));
    $list.append($li);
});

在此之后,就是使用 display: none 隐藏 .select2-selection__choice 元素的问题了。

注意在 jQuery 版本 > 3 中设置 属性 而不是属性 $opt.prop('selected', false) 在其他情况下它不会删除创建的标签;

完整示例可在此处查看:http://jsfiddle.net/tjnicolaides/ybneqdqa/ -- 希望这对其他人有所帮助。

我有同样的需求,所以我写了一个 custom selection adapter 可以用于 Select2 v4.


什么是 Select2 适配器?

根据docs,Select2 使用适配器模式,因此推荐的扩展其功能的方法是实现我们自己的适配器。

SelectionAdapter 控制选择选项的显示,以及需要嵌入到容器中的任何其他内容,例如搜索框。

Select2 提供 SingleSelectionMultipleSelection 适配器作为 SelectionAdapter 的默认实现,分别用于单个和 multi-select 控件。

可以通过将自定义适配器分配给 selectionAdapter 配置选项来覆盖选择适配器。


使用自定义选择适配器选择 2

plugin 的完整代码太大,无法在此处 post。它只有 3kb 缩小。 您必须在 Select2 main javascript file:

之后包含它
<script src="select2.js"></script>
<script src="select2.customSelectionAdapter.min.js"></script>

和 css:

<link rel="stylesheet" href="select2.customSelectionAdapter.css" />

然后,初始化插件如下:

var CustomSelectionAdapter = $.fn.select2.amd.require("select2/selection/customSelectionAdapter");

$("select").select2({
    // other options 
    selectionAdapter: CustomSelectionAdapter
});

默认情况下,标签会紧跟在 select2 容器之后。您可以使用 selectionContainer 选项将它们添加到页面的其他位置:

$("select").select2({
    // other options 
    selectionAdapter: CustomSelectionAdapter,
    selectionContainer: $('.foo')
});

演示

https://andreivictor.github.io/select2-customSelectionAdapter/