Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add class to select2 element in v4.0

This is very similar to this question on how to add class to select2 element, however the answers there appear to target earlier versions of the framework which has undergone some breaking changes in v4.0

According to this issue to add an additional custom class to select2-container, there were several undocumented properties you could pass to the select2 constructor, including: containerCss, containerCssClass, dropdownCss, and dropdownCssClass.

However in version 4 when I run the following code:

$('.select2').select2({     containerCss: "wrap" }); 

I get the following error:

Uncaught Error: No select2/compat/containerCss

How can I pass a class to Select2 in v4.0?

Here's an example in StackSnippets:

$('.select2').select2({      containerCss: "wrap"  });
<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.css" rel="stylesheet"/>  <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>  <script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.js"></script>    <select class="select2 narrow wrap">    <option value="AL">Algebra</option>    <option value="AK">Alaska</option>    <option value="AZ">Arizona</option>  </select>
like image 413
KyleMit Avatar asked Jun 11 '15 18:06

KyleMit


People also ask

How do I add a class to a select2 container?

select2 would make an other span with select2-container class right at the end of the body every time you click on the span tag and the dropdown with the options become visible, so you can use your click event and trigger a function that add your custom class to the dropdown container at the end of the body and also ...

How do you add new option if not exist in the list using select2?

New options can be added to a Select2 control programmatically by creating a new Javascript Option object and appending it to the control: var data = { id: 1, text: 'Barn owl' }; var newOption = new Option(data. text, data.id, false, false); $('#mySelect2'). append(newOption).

What does select2 () do?

Select2 gives you a customizable select box with support for searching, tagging, remote data sets, infinite scrolling, and many other highly used options.


2 Answers

Select2 will store all the information it uses on the original select element. You can access the following information by calling .data('select2') on the original element:

Select2 Data

From there, you can access the $container property to identify the container in the DOM and add the class to that like this:

var $select2 = $('select.select2').select2()  $select2.data('select2').$container.addClass("wrap") 

Here's a demo in Stack Snippets

var $select2 = $('select.select2').select2()  $select2.data('select2').$container.addClass("wrap")
body .select2.narrow {      width: 200px;  }  body .wrap .select2-selection--single {      height: 100%;  }  body .select2-container.wrap .select2-selection--single .select2-selection__rendered {      word-wrap: break-word;      text-overflow: inherit;      white-space: normal;  }
<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.css" rel="stylesheet"/>  <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>  <script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.full.js"></script>    <select class="select2 narrow wrap">    <option value="AL">Really long name that normally</option>    <option value="AK">Alaska</option>    <option value="AZ">Arizona</option>  </select>
like image 95
Nulle Avatar answered Sep 30 '22 09:09

Nulle


You can use the following options to add a class to the container (selection) or dropdown (options):

$('.select2').select2({     containerCssClass: "custom-container",     dropdownCssClass: "custom-dropdown", }); 

According to the Migration Guide in the 4.0 Announcement:

If you use the full build of Select2 (select2.full.js) compatibility modules will be used in some cases to ensure that your code still behaves how you were expecting.

According to the Configuration Docs, the following options can be passed:

Configuration Docs

However, Select2 isn't great about defining what a "container" is and where you'd expect to find it.

Here's a breakdown of some of high level html structures and where the custom classes show up:

Select2 Container vs Dropdown

Here's a running demo that outputs the custom classes to the container and dropdown wrappers and then uses them to style the color of each section (just to prove they're being inserted)

$('.select2').select2({      containerCssClass: "custom-container",      dropdownCssClass: "custom-dropdown",  });
select {    width: 200px;  }    .custom-container span {    color: blue!important;  }  .custom-dropdown {    color: red;  }
<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/css/select2.css" rel="stylesheet"/>  <script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.js"></script>  <script src="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.0/js/select2.full.js"></script>    <select class="select2">    <option value="AL">Algebra</option>    <option value="AK">Alaska</option>    <option value="AZ">Arizona</option>  </select>
like image 40
KyleMit Avatar answered Sep 30 '22 10:09

KyleMit