【问题标题】:jQuery Select2 issue with shown selection显示选择的jQuery Select2问题
【发布时间】:2016-12-09 18:24:36
【问题描述】:

我正在开发一个选择菜单,我在其中使用 Select-2 插件来自定义它。因此,我遇到了一个问题,我尝试在输入字段中重新创建所选项目。因此,当您选择一个项目时,它会在输入字段中显示为灰色的小项目。

这是一个 FIDDLE,它显示了我遇到的问题。

这是我如何呈现输入字段的javascript代码:

var selectMenuItems = [
        {id: 'restaurant', value: 'restaurant'},
        {id: 'shopping', value: 'shopping'},
        {id: 'toilet', value: 'toilet'}
    ]

     function formatSelectItem (selectItem) {
        if (!selectItem.id) { return selectItem.value; }
        var $selectItem = $(
        '<img src="img/markers/'+ selectItem.id.toLowerCase() +'.png"/>' +
        '<span class="select-item-text">'+ selectItem.value+"</span>"
        );
        return $selectItem;
    };

    $("[name='select']").select2({
        placeholder: "Selecteer een categorie",
        templateResult: formatSelectItem,
        data: selectMenuItems
    }).on("change", function(e){
        console.log(e);

        $('.select-multiple :selected').each(function(i, selected) {
            var selectedValue = $(selected).val();

            $('.select2-selection__choice').text(selectedValue);
        });
    });

问题是,当我选择一个项目时,它会在输入字段内显示文本,但如果我选择多个项目,所有项目都将更改为最后选择的项目文本。我怎样才能只将此.text() 绑定到该特定选择项?

在插件Select-2 plugin 的文档中有一个名为“模板”的示例,他们不必将文本或图像附加到所选项目..

【问题讨论】:

  • @ZakariaAcharki 该功能与此无关,它将在谷歌地图中显示并出现选定的标记

标签: javascript jquery jquery-select2 select2


【解决方案1】:

Working fiddle.

您要寻找的是每次循环通过$(this).val() 提供的选定值,并使用.eq() 按索引将该值附加到.select2-selection__choice

$("[name='select']").select2({
  placeholder: "Selecteer een categorie",
  templateResult: formatSelectItem,
  data: selectMenuItems
}).on("change", function(e){
  $.each($(this).val(), function(i, selected) {
    $('.select2-selection__choice').eq(i).prepend(selected+' ');
  });
});

注意:使用prepend() 而不是tex() 来保留标记中的“X”。

希望这会有所帮助。

(function($) {
  $(function() {
    var selectMenuItems = [
      {id: 'restaurant', value: 'restaurant'},
      {id: 'shopping', value: 'shopping'},
      {id: 'toilet', value: 'toilet'}
    ]

    function formatSelectItem (selectItem) {
      if (!selectItem.id) { return selectItem.value; }
      var $selectItem = $(
        '<img src="img/markers/'+ selectItem.id.toLowerCase() +'.png"/>' +
        '<span class="select-item-text">'+ selectItem.value+"</span>"
      );
      return $selectItem;
    };

    $("[name='select']").select2({
      placeholder: "Selecteer een categorie",
      templateResult: formatSelectItem,
      data: selectMenuItems
    }).on("change", function(e){
      $.each($(this).val(), function(i, selected) {
        $('.select2-selection__choice').eq(i).prepend(selected+' ');
      });
    });

  });
})(jQuery);            
.flag-text { margin-left: 10px; }

.select2 {
  width: 100% !important;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.min.js"></script>
<select id="type" name="select" class="select-multiple" multiple="multiple" data-role="none"></select>

使用图片的片段:

(function($) {
  $(function() {
    var selectMenuItems = [
      {id: 'restaurant', value: 'restaurant', img: 'https://www.hughesinsurance.co.uk/img/front/map-marker.png'},
      {id: 'shopping', value: 'shopping', img: 'http://king-of-truck.byclickeat.fr/media/cache/square_40/front/bundle/clickeat/img/map-marker.png'},
      {id: 'toilet', value: 'toilet', img: 'http://www.onebabyowner.co.uk/sites/all/themes/onebabyowner/img/icon/map-marker.png'}
    ]

    function formatSelectItem (selectItem) {
      if (!selectItem.id) { return selectItem.value; }
      var $selectItem = $(
        '<img src="'+ selectItem.img +'"/>' +
        '<span class="select-item-text">'+ selectItem.value+"</span>"
      );
      return $selectItem;
    };

    $("[name='select']").select2({
      placeholder: "Selecteer een categorie",
      templateResult: formatSelectItem,
      data: selectMenuItems
    }).on("change", function(e){
      $.each($(this).val(), function(i, selected) {
        $('.select2-selection__choice').eq(i).prepend(selected+' ');
      });
    });

  });
})(jQuery);            
.flag-text { margin-left: 10px; }

.select2 {
  width: 100% !important;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.min.js"></script>
<select id="type" name="select" class="select-multiple" multiple="multiple" data-role="none"></select>

【讨论】:

  • 如何在选项中包含图片
  • 很抱歉我错过了使用图片的其他小提琴,检查jsfiddle.net/z_acharki/041k90py/9..只需将属性img添加到包含图像url的对象,然后在中引用它&lt;img src="'+ selectItem.img +'"/&gt;.
【解决方案2】:

这是最短的方法:

$('.select-multiple :selected').each(function(i, selected) {
   $('.select2-selection__choice').eq(i).text($(this).val());
});

如果您想在选择的选项中包含图像,请使用 templateSelection 函数。您可以通过将 templateSelection 选项设置为 JavaScript 函数来覆盖选择的显示。

(function($) {
        $(function() {
            var selectMenuItems = [
               {id: 'restaurant', text: 'restaurant', img: 'http://www.freeiconspng.com/uploads/restaurant-icon-png-7.png'},
               {id: 'shopping', text: 'shopping', img: 'http://www.pngall.com/wp-content/uploads/2016/04/Shopping-Free-PNG-Image.png'},
               {id: 'toilet', text: 'toilet', img: 'http://www.freeiconspng.com/uploads/toilet-icon-png-32.png'}
            ]

            function formatSelectItem (selectItem) {
                if (!selectItem.id) { return selectItem.text; }
                var $selectItem = $(
                    '<img src="'+ selectItem.img +'" width="50px" height="50px"/>' +
                    '<span class="select-item-text">'+ selectItem.text+"</span>"
                );
               return $selectItem;
            };
            function formatState (opt) {
                if (!opt.id) {
                   return opt.text;
                }                               
                var $opt = $(
                  '<span><img src="'+opt.img +'" width="50px" height="50px"/>' + opt.text + '</span>'
                );
                return $opt;
            };
            $("[name='select']").select2({
               placeholder: "Selecteer een categorie",
               templateResult: formatSelectItem,
               templateSelection: formatState,
               data: selectMenuItems
            });
            
        });
})(jQuery);            
.flag-text { margin-left: 10px; }

.select2 {
  width: 100% !important;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.min.js"></script>
<select id="type" name="select" class="select-multiple" multiple="multiple" data-role="none"></select>

【讨论】:

    【解决方案3】:

    在你的代码中

            $('.select-multiple :selected').each(function(i, selected) {
                var selectedValue = $(selected).val();
    
                $('.select2-selection__choice').text(selectedValue);
            });
    

    您需要将selectedValue 拆分为值并搜索每个值以放入适合该值索引的文本。

    换句话说,替换该代码:

         $('.select-multiple :selected').each(function(i, selected) {
            var selectedValue = $(this).val();
            $('.select2-selection__choice').eq(i).text(selectedValue);
          });
    

    【讨论】:

    • 我该怎么做? $(selected).val().split()$('.select-2....').text(selectedValue[i])?
    【解决方案4】:

    我以为我必须使用 jquery 来执行此操作,但是当我将 selectMenuItems valueArray 更改为 text 时,插件为我完成了工作:

     var selectMenuItems = [
       {id: 'restaurant', text: 'restaurant'},
       {id: 'shopping', text: 'shopping'},
       {id: 'toilet', text: 'toilet'}
     ]
    

    只是一个简单的修复,我认为我可以在那里设置任何属性

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-17
    • 2021-12-27
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2018-07-11
    • 2017-03-21
    相关资源
    最近更新 更多