Добавить класс в элемент select2

Документация либо ужасна, либо я что-то упускаю. Я пытаюсь добавить класс ошибок в поле select2 для проверки формы. Это просто красная рамка шириной 1 пиксель.

Я нашел метод containerCssClass в документации, но не знаю, как его применять.

Я пробовал следующее без везения:

$("#myBox").select2().containerCssClass('error');

person Deac Karns    schedule 22.02.2013    source источник
comment
Было бы очень полезно узнать, что такое #myBox на Земле ?????? Это объект выбора или впоследствии созданные элементы диапазона select2?????   -  person Swift    schedule 18.10.2019


Ответы (8)


jQuery использует объекты JSON для инициализации, поэтому я думаю, что и этот:\

$("#myBox").select2({ containerCssClass : "error" });

Если вы хотите добавить/удалить класс, вы можете сделать это после его инициализации.

$($("#myBox").select2("container")).addClass("error");
$($("#myBox").select2("container")).removeClass("error");

Вышеупомянутая функция получает узел DOM основного контейнера select2, например: $("#myBox").select2("container")

Важно
Вам нужно будет использовать метод container для получения контейнера, поскольку вы не будете редактировать SELECT напрямую, а select2 сгенерирует другой HTML для имитации SELECT, который можно стилизовать.

person Niels    schedule 22.02.2013
comment
Ваше первое предложение не сработало для меня. Для второго, если у вас есть несколько выборок на странице с одним классом, вам нужно перебрать все, чтобы добавить к каждому из них нужный вам класс. Выполнение $($(".myclass").select2("container")).addClass("error") не сработает. - person machineaddict; 10.12.2014
comment
Обратите внимание, что вы должны использовать полную версию: github.com/select2/select2/issues/3302 - person user1063287; 13.08.2016
comment
Я получаю Uncaught TypeError: Cannot read property 'apply' of undefined для второго использования только за $('#myBox').select2('container') - person Jared; 07.09.2016
comment
Если вы получаете Uncaught Error: No select2/compat/containerCss(…), вам нужно включить версию select2.full.js вместо базовой - person Ray; 21.10.2016

Для уже инициализированного элемента select2 я пробовал решение @Niels, но это привело к ошибке: Uncaught TypeError: Cannot read property 'apply' of undefined

Вошел в источник, и это работало вместо этого:

$($('#myBox').data('select2').$container).addClass('error')
$($('#myBox').data('select2').$container).removeClass('error')

Полное использование select2 v4.0.3

person Jared    schedule 07.09.2016
comment
Это работает, но начальный $(...) избыточен, потому что $container уже является элементом jquery. - person Soufiane Ghzal; 26.06.2017
comment
Спасибо, ваше решение спасло мне жизнь - person Johnny Nguyen; 15.01.2018
comment
Если вы ищете фактический элемент, к которому containerCssClass добавляет классы, это $selection вместо $container. - person tt_emrah; 14.04.2018
comment
@SoufianeGhzal: Нет, вам нужно использовать $container вместо container. - person mhellmeier; 03.12.2018

Согласно документации, containerCssClass является только свойством конструктора. Лучшее, что вы, вероятно, сможете сделать, это повторно инициализировать его, когда вы получите сообщение об ошибке:

$("#myBox").select2({
    containerCssClass: "error" 
});

Примечание из комментариев: если вы получаете Uncaught Error: No select2/compat/containerCss(…), вам необходимо включить select2.full.js версия вместо базовой

person Samsquanch    schedule 22.02.2013
comment
Спасибо за предложение добавить select2.full.js - person Shiv; 25.04.2017
comment
@Samsquanch Где скачать полную версию? Я не могу найти его. - person Grizzly; 20.09.2017
comment
Nvmd, я скачал с Nuget, который был в основном устаревшим - person Grizzly; 20.09.2017
comment
Лучший ответ, нужно ссылаться на select2.full.js вместо основного. - person PierrickM; 24.03.2020

Для тех, кто блуждает здесь из Google, свойство containerCssClass имеет вводящее в заблуждение имя, поскольку оно фактически не добавляет никаких классов к элементу контейнера, а скорее к элементу выбора. Вы можете увидеть это, когда просматриваете сгенерированный html.

Я наткнулся на здесь небольшой лайфхак, который позволяет применить CSS класс в контейнер, добавив его в свойство theme, например так:

$('#my-select').select2({
    theme: "bootstrap myCssClass",
});
person Shahin Dohan    schedule 17.10.2018
comment
Если вы хотите сохранить класс по умолчанию и добавить к нему свой собственный класс, вы можете попробовать что-то вроде: theme:"default your-custom-class" - person Nadav; 01.07.2020

использовать вариант темы.

 $(".select").select2({
        placeholder: "",
        allowClear: false,
        theme: "custom-option-select"
    });
person steve joe    schedule 13.12.2016

Самый простой способ:

Создайте родительский класс, например

<div class="select-error">
    <select id="select2" name="select2" data-required class="form-control">
        <option value="" selected>No selected</option>
        <option value="1">First</option>
        <option value="2">Second</option>
    </select>
</div>

когда вы проверяете его с помощью jquery или php, просто добавьте стиль или css в класс .select-error, например

style="border:1px solid red; border-radius: 4px"

Пример jQuery:

$('[data-required]').each(function() {
  if (!$(this).val()) {
    if ($(this).data('select2')) {
      $('.select-error').css({
        'border': '1px solid red',
        'border-radius': '4px'
      });
    }
  });
person trisztan    schedule 28.08.2016
comment
Не отвечая точно на вопрос, я уверен, что это то, что действительно нужно большинству зрителей. - person Vincent; 18.10.2016
comment
Но что, если у меня есть 2 разных выбора, это также повлияет на второй выбор и изменит его на красную рамку - person user3548161; 01.08.2017

Вы можете использовать вариант dropdownCssClass

$("#myBox").select2({
    containerCssClass: "error" 
});
person ycscholes    schedule 28.07.2016

select2 будет создавать другой диапазон с классом select2-container прямо в конце тела каждый раз, когда вы нажимаете на тег span, и выпадающий список с параметрами становится видимым, поэтому вы можете использовать событие щелчка и запускать функцию, которая добавляет ваш пользовательский класс в раскрывающийся контейнер в конце тела, а также диапазон, когда раскрывающийся список не отображается. это полностью сработало для меня.

$($(id).data('select2').$container).addClass("your-custom-class")
$($(id).data('select2').$container).click(() => $.each($("span.select2-container"), (index, value) => {
    if (index === $("span.select2-container").length - 1) {
        $(value).addClass("your-custom-class")
    }
}))
person Amir Mansoorian    schedule 15.01.2021