Как отключить заголовок в select2

У меня есть раскрывающийся список select2, который выглядит так:

    $(function () {
  $("#itemSelect").select2().on("select2:select", function (e) {
   $("#itemSelect").val(-1).trigger("change");
        var id = e.params.data.title;
        var url = siteRoot + "/site/item?itemID=" + id ;
        $("#Container").load(url);
    });
});

Он получает значения из моей модели в html:

<select class="js-data-example-ajax" aria-expanded="true" style="width: 100%; display: none;" id="itemSelect">
<option disabled selected value="-1"> Search by item </option>
@foreach (var item in Model)
{
    <option text="@item.Id" title="@item.Id">
        item.Name
    </option>
}

Everything works fine, EXCEPT when I choose an item and it's loaded, I can hover over the dropdown and it shows me the ID from the item. I don't want to show the ID!

введите описание изображения здесь

На картинке вы видите раскрывающийся список и номер элемента, который появляется при наведении курсора на «Чай со льдом».

Я знаю, это потому, что select2 получает идентификатор var id = e.params.data.title;, но как я могу это изменить? Это не работает с var id = e.params.data.id;

Я пытался использовать всплывающую подсказку, но я новичок в этом.

//$("#select2-itemSelect-container").tooltip({
//    title: "Search item",

//    placement: "auto"
//});

Я просто хочу избавиться от идентификатора в раскрывающемся списке при наведении курсора. Каждая помощь приветствуется.


person marS    schedule 19.02.2016    source источник
comment
Я не думаю, что понимаю, где отображается идентификатор и каким образом. Не могли бы вы опубликовать пример или скриншот проблемы. Похоже, у вас есть другой скрипт, который показывает идентификатор...   -  person CzechErface    schedule 19.02.2016
comment
Я отправил ответ, но я не слишком уверен в его правильности. Это также может помочь опубликовать jsfiddle, если никто не может понять это.   -  person CzechErface    schedule 19.02.2016


Ответы (9)


Возможно, я немного опоздал, но ни одно из этих решений не сработало для меня, так как я динамически добавлял поля select2 в пользовательский интерфейс.

Этот код помог мне:

$('.select2-selection__rendered').hover(function () {
    $(this).removeAttr('title');
});

Если вы также динамически добавляете поля select2, не забывайте всегда выполнять этот код перед приведенным выше:

$('.select2-selection__rendered').unbind('mouseenter mouseleave');

Этот код сначала удалит прослушиватель on hover во всех полях select2.

person Dean Koštomaj    schedule 13.03.2018
comment
Или просто сделайте это для всего документа и всех элементов .select2-selection__rendered, которые могут появиться в любое время с помощью $(document).on('mouseenter', '.select2-selection__rendered', function () { $(this).removeAttr('title'); });. - person Ján Janočko; 31.01.2020

Эту проблему можно воспроизвести в Select2 v4, наведя указатель мыши на поле выбора (в режиме одиночного выбора) или на выбранные теги (в режиме множественного выбора):

введите здесь описание изображения введите здесь описание изображения

Плагин по умолчанию прикрепляет к этим элементам атрибут title, и нет доступных параметров конфигурации, чтобы отключить это поведение.

В итоге я написал небольшое расширение для плагина Select2. Я добавил новую опцию selectionTitleAttribute, для которой необходимо установить значение false, чтобы удалить атрибут title.

Добавьте следующий код сразу после файла js плагина:

;(function($) {

  // Extend defaults
  //
  var Defaults = $.fn.select2.amd.require('select2/defaults');

  $.extend(Defaults.defaults, {
    selectionTitleAttribute: true
  });

  // SingleSelection
  //
  var SingleSelection = $.fn.select2.amd.require('select2/selection/single');

  var _updateSingleSelection = SingleSelection.prototype.update;

  SingleSelection.prototype.update = function(data) {

    // invoke parent method
    _updateSingleSelection.apply(this, Array.prototype.slice.apply(arguments));

    var selectionTitleAttribute = this.options.get('selectionTitleAttribute');

    if (selectionTitleAttribute === false) {
      var $rendered = this.$selection.find('.select2-selection__rendered');
      $rendered.removeAttr('title');
    }

  };


  // MultipleSelection
  //
  var MultipleSelection = $.fn.select2.amd.require('select2/selection/multiple');

  var _updateMultipleSelection = MultipleSelection.prototype.update;

  MultipleSelection.prototype.update = function(data) {

    // invoke parent method
    _updateMultipleSelection.apply(this, Array.prototype.slice.apply(arguments));

    var selectionTitleAttribute = this.options.get('selectionTitleAttribute');

    if (selectionTitleAttribute === false) {
      var $rendered = this.$selection.find('.select2-selection__rendered');
      $rendered.find('.select2-selection__choice').removeAttr('title');
      this.$selection.find('.select2-selection__choice__remove').removeAttr('title');
    }

  };

})(window.jQuery);

Применение

Инициализируйте плагин select2 с параметром selectionTitleAttribute, установленным на false:

$("select").select2({
  // other options 
  selectionTitleAttribute: false
});

Демо

Скрипт: http://jsfiddle.net/hr8bqnpn/

person andreivictor    schedule 20.09.2017
comment
Можете ли вы представить это как PR для Select2? Похоже, нужна помощь github.com/select2/select2/pull/3988 - person Victorio Berra; 04.01.2019
comment
Пожалуйста, отправьте это в git. - person erosebe; 02.04.2020
comment
Я добавил это.$selection.find('.select2-selection__choice__remove').removeAttr('title'); В части MultipleSelection, чтобы удалить заголовок Удалить на кнопке. - person Guillaume; 24.12.2020
comment
Какую версию ты используешь? - person andreivictor; 24.12.2020

Вы можете использовать события, чтобы удалить тег заголовка.

Например, этот код работает с select2 v4.0:

$('select').on('change', function (evt) {
    $('.select2-selection__rendered').removeAttr('title');
});

http://jsfiddle.net/by8k1dv9/

person Pavel K    schedule 26.01.2017

привет всем, если у вас есть эта проблема, этот простой трюк

<script>

$(document).on('mouseenter', '.select2-selection__rendered',  function () {


    $(this).removeAttr("title");

});
person Ayoub Got    schedule 06.10.2020

Попробуйте отключить всплывающую подсказку для созданного select2.

$(function () {
    $("#itemSelect").select2().on("select2:select", function (e) {
        $("#itemSelect").val(-1).trigger("change");
        var id = e.params.data.title;
        var url = siteRoot + "/site/item?itemID=" + id ;
        $("#Container").load(url);
    }).tooltip('disable');
});
person CzechErface    schedule 19.02.2016
comment
Не могли бы вы предоставить JSFiddle с проблемой? Мне кажется, что я что-то упускаю из виду, поскольку не могу воспроизвести поведение. - person CzechErface; 22.02.2016

После инициализации select2 используйте приведенную ниже строку кода, чтобы удалить атрибут title из опций select2 из кода. удалите знак `, затем поместите в свой файл сценария

   $("ul.select2-selection__rendered").hover(function(){
      $(this).find('li').removeAttr('title');
    });
person Nick    schedule 23.02.2019

К сожалению, мне не повезло с приведенными выше решениями, возможно, потому, что в этом проекте используется начальная загрузка, а в Select2 использовались всплывающие подсказки начальной загрузки, которые выглядят по-разному и исчезают.

В этом случае при наведении курсора Select2 фактически удалит атрибут title, заменив его атрибутом aria-describedby, который содержит идентификатор вновь созданного элемента всплывающей подсказки. При выходе из мыши aria-describedby был удален, а атрибут title снова восстановлен.

Таким образом, попытка удалить атрибут title не сработала, так как он уже был удален, а затем снова восстановлен в mouseleave. Так что это помогло мне:

$(document).on('mouseenter', '.select2-selection__rendered', function () {
  var tooltipId = $(this).attr("aria-describedby"); // contains the id of the tooltip
  $("#" + tooltipId).hide(); // hide the tooltip before it fades in
  $(this).unbind('mouseenter mouseleave'); // stop it showing another tooltip
});

Приведенный выше код не препятствует тому, чтобы Select2 пытался отобразить всплывающую подсказку при первом наведении курсора мыши на нее, но .hide() успешно предотвращает ее отображение до того, как она начнет исчезать. После этого отмена привязки наведения останавливает Select2 от попыток показать какие-либо другие из них.

person ingredient_15939    schedule 31.07.2020

Я пытаюсь использовать это, и это работает:

        $(document).on('mouseenter', '.select2-selection__rendered', function () {
            $('.select2-selection__rendered').removeAttr('title');
        });
person Arya Ht    schedule 15.05.2021

Вы можете просто прокомментировать эти пару строк в вашем скрипте select2

//$rendered.attr('title', selection.title || selection.text);
//$selection.attr('title', selection.title || selection.text);

Это не добавит атрибут title в первую очередь

person Kareem    schedule 19.04.2018
comment
Что, если я установлю select2 с npm/bower или чем-то еще? - person Oleksandr Savchenko; 26.04.2018
comment
найдите скрипт в папке модулей и отредактируйте его, как указано выше, или просто добавьте скрипт в html-тег на странице. Если вы хотите, чтобы он скомпилировался с помощью gulp/bower или чего-то подобного, просто добавьте скрипт в папку src и отредактируйте его, как указано выше. - person Kareem; 26.04.2018
comment
Хотя технически это работает, поощрять людей делать что-то, что идет вразрез с лучшими практиками, как правило, плохо. - person Austin Hemmelgarn; 26.03.2019
comment
@AustinHemmelgarn Я согласен. Где решение, которое не соответствует лучшим практикам? Я только пытаюсь помочь! - person Kareem; 27.03.2019