This page of the documentation is currently undergoing a rewrite and may be incomplete. If you do not find the answer you are looking for on this page, you may have better luck looking at the old options page.

This documentation is set up in the form of a FAQ and covers the most common questions. If you do not find the answer to your question here, you may want to reach out to the community to see if someone else can answer it.

Core options

How should Select2 be initialized?

Select2 will register itself as a jQuery function if you use any of the distribution builds, so you can call .select2() on any jQuery element where you would like to initialize Select2.


1
$('select').select2();

You can optionally pass an object containing all of the options that you would like to initialize Select2 with.


1
2
3
$('select').select2({
  placeholder: 'Select an option'
});

Can default options be set for all dropdowns?

In some cases, you need to set the default options for all instances of Select2 in your web application. This is especially useful when you are migrating from past versions of Select2, or you are using non-standard options like custom AMD builds. Select2 exposes the default options through $.fn.select2.defaults, which allows you to set them globally.

When setting options globally, any past defaults that have been set will be overridden. Default options are only used when an option is requested that has not been set during initialization.

You can set default options by calling $.fn.select2.defaults.set("key", "value").


1
$.fn.select2.defaults.set("theme", "classic");

How can I set a default value for a nested option?

The key that is set should take the same format as keys set using HTML data-* attributes which means that two dashes (--) will be replaced by a level of nesting, and a single dash (-) will convert it to a camelCase string.


1
$.fn.select2.defaults.set("ajax--cache", false);

How can I reset all of the global default options?

You can reset the default options to their initial values by calling


1
$.fn.select2.defaults.reset();

Can I declare my configuration within the HTML?

It is recommended that you declare your configuration options for Select2 when initializing Select2. You can also define your configuration options by using the HTML5 data-* attributes, which will override any options set when initializing Select2 and any defaults.

How should camelCase options be written?

HTML data attributes are case-insensitive, so any options which contain capital letters will be parsed as if they were all lowercase. Because Select2 has many options which are camelCase, where words are separated by uppercase letters, you must write these options out with dashes instead. So an option that would normally be called allowClear should instead be defined as allow-clear.

This means that if you declare your <select> tag as...


1
<select data-tags="true" data-placeholder="Select an option" data-allow-clear="true"></select>

Will be interpreted the same as initializing Select2 as...


1
2
3
4
5
$("select").select2({
  tags: "true",
  placeholder: "Select an option",
  allowClear: true
});

Are options with nested configurations supported?

You can also define nested configurations, which are typically needed for options such as AJAX. Each level of nesting should be separated by two dashes (--) instead of one. Due to a jQuery bug, nested options using data-* attributes do not work in jQuery 1.x.


1
<select data-ajax--url="http://example.org/api/test" data-ajax--cache="true"></select>

Which will be interpreted the same as initializing Select2 with...


1
2
3
4
5
6
$("select").select2({
  ajax: {
    url: "http://example.org/api/test",
    cache: true
  }
});

The value of the option is subject to jQuery's parsing rules for HTML5 data attributes.

Can I use Select2 with my AMD or CommonJS loader?

Select2 should work with most AMD- or CommonJS-compliant module loaders, including RequireJS and almond. Select2 ships with a modified version of the UMD jQuery template that supports both CommonJS and AMD environments.

How do I tell Select2 where to look for modules?

For most AMD and CommonJS setups, the location of the data files used by Select2 will be automatically determined and handled without you needing to do anything.

If you are using Select2 in a build environment where preexisting module names are changed during a build step, Select2 may not be able to find optional dependencies or language files. You can manually set the prefixes to use for these files using the amdBase and amdLanguageBase options.


1
2
$.fn.select2.defaults.set('amdBase', 'select2/');
$.fn.select2.defaults.set('amdLanguageBase', 'select2/i18n/');

Select2 is being placed before jQuery in my JavaScript file

Due to a bug in older versions of the r.js build tool, Select2 was sometimes placed before jQuery in then compiled build file. Because of this, Select2 will trigger an error because it won't be able to find or load jQuery.

By upgrading to version 2.1.18 or higher of the r.js build tool, you will be able to fix the issue.

Should I point to the files in dist or src?

Select2 internally uses AMD and the r.js build tool to build the files located in the dist folder. These are built using the files in the src folder, so you can just point your modules to the Select2 source and load in jquery.select2 or select2/core when you want to use Select2. The files located in the dist folder are also AMD-compatible, so you can point to that file if you want to load in all of the default Select2 modules.

Data adapters

Can Select2 be used with a <select> tag?

Select2 was designed to be a replacement for the standard <select> boxes that are displayed by the browser, so by default it supports all options and operations that are available in a standard select box, but with added flexibility. There is no special configuration required to make Select2 work with a <select> tag.

Does Select2 support nesting options?

A standard <select> box can display nested options by wrapping them with in an <optgroup> tag.


1
2
3
4
5
<select>
  <optgroup label="Group Name">
    <option>Nested option</option>
  </optgroup>
</select>

How many levels of nesting can there be?

Only a single level of nesting is allowed per the HTML specification. If you nest an <optgroup> within another <optgroup>, Select2 will not be able to detect the extra level of nesting and errors may be triggered as a result.

Can <optgroup> tags be made selectable?

No. This is a limitation of the HTML specification and is not a limitation that Select2 can overcome. You can emulate grouping by using an <option> instead of an <optgroup> and changing the style by using CSS, but this is not recommended as it is not fully accessible.

How are <option> and <optgroup> tags serialized into data objects?

Select2 will convert the <option> tag into a data object based on the following rules.


1
2
3
4
5
{
  "id": "value attribute" || "option text",
  "text": "label attribute" || "option text",
  "element": HTMLOptionElement
}

And <optgroup> tags will be converted into data objects using the following rules


1
2
3
4
5
{
  "text": "label attribute",
  "children": [ option data object, ... ],
  "element": HTMLOptGroupElement
}

Can I load data into Select2 using an array?

While Select2 is designed to be used with a <select> tag the data that is used to search through and display the results can be loaded from a JavaScript array using the data option. This option should be passed in during the initialization of Select2.


1
2
3
4
5
6
7
8
9
$('select').select2({
  data: [
    {
      id: 'value',
      text: 'Text to display'
    },
    // ... more data objects ...
  ]
});

What properties are required on the objects passed in to the array?

The id and text properties are required on each object, and these are the properties that Select2 uses for the internal data objects. Any additional paramters passed in with data objects will be included on the data objects that Select2 exposes.

Do the id properties have to be strings?

Because the value attributes on a <select> tag must be strings, the id property on the data objects must also be strings. Select2 will attempt to convert anything that is not a string to a string, which will work for most situations, but it is recommended to force all of your ids to strings ahead of time.

I can't select results with blank ids or an id of 0!

See Do the id properties have to be strings?.

How should nested results be formatted?

Nested results should be specified using the children property on the data objects that are passed in. This children property should be an array of data objects that are grouped under this option, and the label for the group should be specified as the text property on the root data object.


1
2
3
4
5
6
7
8
9
10
{
  text: 'Group label',
  children: [
    {
      id: 'nested-1',
      text: 'First nested option'
    },
    // ... more data objects ...
  ]
}

How many levels of nesting are allowed?

Because Select2 falls back to an <optgroup> when creating nested options, only a single level of nesting is supported. Any additional levels of nesting is not guaranteed to be displayed properly across all browsers and devices.

Why are <option> tags being created?

The data option is a shortcut that Select2 provides which allows you to load options into your select from a data array.

This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

My objects don't use id for their unique identifiers, what can I do?

Select2 requires that the id property is used to uniquely identify the options that are displayed in the results list. If you use a property other than id (like pk) to uniquely identify an option, you need to map your old property to id before passing it to Select2.

If you cannot do this on your server or you are in a situation where the identifier cannot be changed, you can do this in JavaScript before passing it to Select2.


1
2
3
4
5
var data = $.map(yourArrayData, function (obj) {
  obj.id = obj.id || obj.pk; // replace pk with your identifier

  return obj;
});

My objects use a property other than text for the text that needs to be displayed

Just like with the id property, Select2 requires that the text that should be displayed for an option is stored in the text property. You can map this property from any existing property using the following JavaScript.


1
2
3
4
5
var data = $.map(yourArrayData, function (obj) {
  obj.text = obj.text || obj.name; // replace name with the property used for the text

  return obj;
});

Can Select2 be connected to a remote data source?

Select2 supports connecting to a remote data source using the ajax option.

How can I set the initially selected options when using AJAX?

You can refer to the following Stack Overflow answer if you want to set the initial value for AJAX requests: Select2 4.0.0 initial value with AJAX

What should the results returned to Select2 look like?

The data returned by the data provider or by processResults should be a JSON object containing an array of objects keyed by the results key.

Each object should contain, at a minimum, an id and a text property. The text property will be displayed by default, unless you are using templateResult and templateSelection to customize the way options and selections are rendered.

The response object may also contain pagination data, if you would like to use the "infinite scroll" feature. See "What properties are required on the objects passed in to the array?" for more information. A complete example is as follows:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
  "results": [
    {
      "id": 1,
      "text": "Option 1"
    },
    {
      "id": 2,
      "text": "Option 2"
    }
  ],
  "pagination": {
    "more": true
  }
}

Results for grouped options

When options are to be generated in <optgroup> sections, options should be nested under the children attribute of each group object:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
  "results": [
    { 
      "text": "Group 1", 
      "children" : [
        {
            "id": 1,
            "text": "Option 1.1"
        }
        {
            "id": 2,
            "text": "Option 1.2"
        }
      ]
    },
    { 
      "text": "Group 2", 
      "children" : [
        {
            "id": 3,
            "text": "Option 2.1"
        }
        {
            "id": 4,
            "text": "Option 2.2"
        }
      ]
    }
  ],
  "paginate": {
    "more": true
  }
}

Is there a way to modify the response before passing it back to Select2?

You can use the ajax.processResults option to modify the data returned from the server before passing it to Select2. The data structure returned by processResults should match the format as specified above.


1
2
3
4
5
6
7
8
9
10
$('select').select2({
  ajax: {
    url: '/example/api',
    processResults: function (data) {
      return {
        results: data.items
      };
    }
  }
});

A request is being triggered on every key stroke, can I delay this?

By default, Select2 will trigger a new AJAX request whenever the user changes their search term. You can set a time limit for debouncing requests using the ajax.delay option.


1
2
3
4
5
6
$('select').select2({
  ajax: {
    url: '/example/api',
    delay: 250
  }
});

This will tell Select2 to wait 250 milliseconds before sending the request out to your API.

How do I tell Select2 which URL to get the results from?

When connecting Select2 to a remote data source, you have the option of using either a single endpoint (a single page which handles all requests) or a dynamic endpoint (one of many pages). You can point Select2 to a single endpoint during initialization by specifying a string for the ajax.url option.


1
2
3
4
5
$('select').select2({
  ajax: {
    url: '/path/to/search/endpoint'
  }
});

If there isn't a single url for your search results, or you need to call a function to determine the url to use, you can specify a function for the ajax.url option, and this will be used instead. The query parameters will be passed in through the params option.


1
2
3
4
5
6
7
$('select').select2({
  ajax: {
    url: function (params) {
      return '/some/url/' + params.term;
    }
  }
});

I want to add more query parameters to the request, where can this be done?

By default, Select2 will send the query term as well as the pagination data as query parameters in requests. You can override the data that is sent to your API, or change any of the query parameters, by overriding the ajax.data option.


1
2
3
4
5
6
7
8
9
10
11
12
13
$('select').select2({
  ajax: {
    data: function (params) {
      var query = {
        search: params.term,
        page: params.page
      }

      // Query parameters will be ?search=[term]&page=[page]
      return query;
    }
  }
});

The results that I am seeing never change

Select2 expects that the results that are returned from the remote endpoint are already filtered ahead of time based on the search term. If your remote endpoint just returns the list of all possible options, you may be interested in using Select2's support for data arrays.

Can an AJAX plugin other than jQuery.ajax be used?

Select2 uses the transport method defined in ajax.transport to send requests to your API. By default, this transport method is jQuery.ajax but this can be changed.


1
2
3
4
5
6
7
8
9
$('select').select2({
  ajax: {
    transport: function (params, success, failure) {
      var request = new AjaxRequest(params.url, params);
      request.on('success', success);
      request.on('failure', failure);
    }
  }
});

How to programmatically access a selection data?

There are few ways to programmatically access the selection data. Calling select2('data') will return the JavaScript array of an objects representing the current selection. Each object will have properties/values which was in the source data objects passed through processResults and templateResult functions (as in Loading data from an array and Connecting to a remote data source).


1
$('select').select2('data');

As Select2 uses the HTML <SELECT> element to store the selection result, the selection data are represented by <OPTION> elements and can be accessed in the plain jQuery/DOM manner:


1
$('select').find(':selected');

It is possible to extend the <OPTION> elements representing selection with the HTML data-* attributes containing arbitrary data from the source data objects:


1
2
3
4
5
6
7
8
9
10
$('select').select2({
  // ...
  templateSelection: function (data, container) {
    $(data.element).attr('data-custom-attribute', data.customValue);
    return data.text;
  }
});

// Retrieve custom attribute value of the first selected element
$('select').find(':selected').attr('data-custom-attribute')

In addition, properties/values from source data objects can ba accessed from within an event handler:


1
2
3
$('select').on('select2:select', function (event) {
  console.log(event.params.data)
});

Displaying selections

Can I allow users to make multiple selections?

Yes, Select2 supports making multiple selections through the use of the multiple option that can be passed in when initializing Select2.

Can the multiple attribute be used on my <select> element?

Yes, Select2 will automatically map the value of the multiple attribute to the multiple option during initialization.

How can I have Select2 display a placeholder?

Select2 supports displaying a placeholder by default using the placeholder option. This can be either a data object matching the placeholder option, or a string to display as the placeholder if you are using a blank placeholder option.


1
2
3
$('select').select2({
  placeholder: 'Select an option'
});

My first option is being displayed instead of my placeholder

This usually means that you do not have a blank <option></option> as the first option in your <select>.

Note that this does not apply to multiple selects, as the browser does not select the first option by default when multiple selections can be made.

I am using AJAX, can I still show a placeholder?

Yes, Select2 supports placeholders for all configurations. You will still need to add in the placeholder option if you are using a single select.

Can I use an option without a blank value as my placeholder?

The placeholder option allows you to pass in a data object instead of just a string if you need more flexibility. The id of the data object should match the value of the placeholder option.


1
2
3
4
5
6
$('select').select2({
  placeholder: {
    id: '-1', // the value of the option
    text: 'Select an option'
  }
});

Can I change how the placeholder looks?

When using Select2 when only a single selection can be made, the placeholder option will be passed through the standard templating methods, including the templateSelection option, so you are able to change how it is displayed.


1
2
3
4
5
6
7
8
9
$('select').select2({
  templateResult: function (data) {
    if (data.id === '') { // adjust for custom placeholder values
      return 'Custom styled placeholder text';
    }

    return data.text;
  }
});

When multiple selections are allowed, the placeholder will be displayed using the placeholder attribute on the search box. You can customize the display of this placeholder using CSS, as explained in the following Stack Overflow answer: Change an input's HTML5 placeholder color with CSS

My placeholders aren't being displayed in Internet Explorer

Select2 uses the native placeholder attribute on input boxes for the multiple select, and that attribute is not supported in older versions of Internet Explorer. You need to include Placeholders.js on your page, or use the full build, in order to add placeholder attribute support to input boxes.

Can I allow users to clear their selections?

You can allow people to clear their current selections with the allowClear option when initializing Select2. Setting this option to true will enable an "x" icon that will reset the selection to the placeholder.


1
2
3
4
$('select').select2({
  placeholder: 'This is my placeholder',
  allowClear: true
});

Why is a placeholder required?

This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

The "x" icon is not clearing the selection

This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

Can users remove all of their selections in a multiple select at once?

Yes, by setting the value of the control to null:


1
$('select').val(null).trigger('change');

See https://select2.github.io/examples.html#programmatic for a working example.

How can I customize the way selections are displayed?

When a selection is made by the user Select2 will display the text of the option by default, just like how it is displayed in a standard select box. You can override the display of the selection by setting the templateSelection option to a JavaScript function.


1
2
3
4
5
6
7
function template(data, container) {
  return data.text;
}

$('select').select2({
  templateSelection: template
});

Nothing is being displayed when I select an option

This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

I am using HTML in my selection template but it isn't displaying it

If you want to use HTML in your selection template, you will need to return a jQuery object. Otherwise, Select2 will assume that your template only returns text and will escape it.


1
2
3
4
5
6
7
8
function template(data, container) {
  return $('<strong></strong>')
    .text(data.text);
}

$('select').select2({
  templateSelection: template
});

How can I access the container where the selection is displayed?

This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

Displaying results

Can I change when search results are loaded?

Can Select2 wait until the user has typed a search term before triggering the request?


1
2
3
4
5
$('select').select2({
  ajax: {
    delay: 250 // wait 250 milliseconds before triggering the request
  }
});
This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

Select2 is allowing long search terms, can this be prevented?


1
2
3
$('select').select2({
  maximumInputLength: 20 // only allow terms up to 20 characters long
});
This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

I only want the search box if there are enough results


1
2
3
$('select').select2({
  minimumResultsForSearch: 20 // at least 20 results must be displayed
});
This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

How can I permanently hide the search box?


1
2
3
$('select').select2({
  minimumResultsForSearch: Infinity
});
This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

Can I change how selecting results works?

Can I select the highlighted result when the dropdown is closed?


1
2
3
$('select').select2({
  selectOnClose: true
});
This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

Can I prevent the dropdown from closing when a result is selected?


1
2
3
$('select').select2({
  closeOnSelect: false
});
This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

Can options be created based on the search term?

How do I enable tagging?


1
2
3
$('select').select2({
  tags: true
});
This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

Does tagging work with a single select?

Yes.

This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

How do I add extra properties to the tag?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$('select').select2({
  createTag: function (params) {
    var term = $.trim(params.term);

    if (term === '') {
      return null;
    }

    return {
      id: term,
      text: term,
      newTag: true // add additional parameters
    }
  }
});
This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

Can I control when tags are created?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
$('select').select2({
  createTag: function (params) {
    // Don't offset to create a tag if there is no @ symbol
    if (params.term.indexOf('@') === -1) {
      // Return null to disable tag creation
      return null;
    }

    return {
      id: params.term,
      text: params.term
    }
  }
});
This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

How do I control the placement of the option?


1
2
3
4
5
6
$('select').select2({
  insertTag: function (data, tag) {
    // Insert the tag at the end of the results
    data.push(tag);
  }
});
This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

Can I change how the dropdown is placed?

This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

1
2
3
$('select').select2({
  dropdownParent: $('#my_amazing_modal')
});
This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

I'm using a Bootstrap modal and I can't use the search box

Use the dropdownParent option, setting it to the modal.

This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

I'm using jQuery UI and I can't use the search box

This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

Events

Public jQuery events

What events will Select2 trigger?

Select2 will trigger a few different events when different actions are taken using the component, allowing you to add custom hooks and perform actions.

change
Triggered whenever an option is selected or removed.
select2:close
Triggered whenever the dropdown is closed.
select2:closing
Triggered before the dropdown is closed. This event can be prevented.
select2:open
Triggered whenever the dropdown is opened.
select2:opening
Triggered before the dropdown is opened. This event can be prevented.
select2:select
Triggered whenever a result is selected.
select2:selecting
Triggered before a result is selected. This event can be prevented.
select2:unselect
Triggered whenever a selection is removed.
select2:unselecting
Triggered before a selection is removed. This event can be prevented.

Does Select2 include extra information in these events?

This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

How can I attach listeners for these events?


1
2
3
$('select').on('select2:select', function (evt) {
  // Do something
});
This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

What events does Select2 listen for?

Select2 will listen for the change event on the <select> that it is attached to. If you make any external changes that need to be reflected in Select2 (such as changing the value), you should trigger this event.


1
2
$('select').val('US'); // Select the option with a value of 'US'
$('select').trigger('change'); // Notify any JS components that the value changed

Can I trigger an event other than change to notify Select2 of changes?

It's common for other components to be listening to the change event, or for custom event handlers to be attached that may have side effects. Select2 does not have a custom event (like select2:update) that can be triggered other than change. You can rely on jQuery's event namespacing to limit the scope to Select2 though by triggering the change.select2 event.


1
2
$('select').val('US'); // Change the value or make some change to the internal state
$('select').trigger('change.select2'); // Notify only Select2 of changes

What events can be prevented? How can I prevent a selection from being made?

This answer to this question has not yet been written. You can improve this documentation by creating a pull request with an answer to this question.

Internal Select2 events

Select2 has an internal event system that works independently of the DOM event system. This internal event system is only accessible from plugins and adapters that are connected to Select2.

Backwards compatibility

Simplified function for matching data objects

Added in Select2 4.0.0. This method was added to make upgrading easier from earlier versions of Select2.

During the Select2 4.0.0 release, the matcher function was changed to allow for more complex matching of nested objects.

Key
matcher
Value
A function taking a search term and the data object text.
Adapter
oldMatcher

The custom matcher example provides a guide for how to use this in your own application. For those upgrading from older versions of Select2, you just need to wrap your old matcher with this function to maintain compatibility.

Old initial selections with initSelection

Deprecated in Select2 4.0. This has been replaced by another option and is only available in the full builds of Select2.

In the past, Select2 required an option called initSelection that was defined whenever a custom data source was being used, allowing for the initial selection for the component to be determined. This has been replaced by the current method on the data adapter.

Key
initSelection
Value
A function taking a callback
Adapter
DataAdapter
Decorator
InitSelection

Querying old data with query

Deprecated in Select2 4.0. This has been replaced by another option and is only available in the full builds of Select2.

In the past, Select2 supported an option called query that allowed for a custom data source to be used. This option has been replaced by the query method on the data adapter and takes a very similar set of parameters.

Key
query
Value
A function taking params (including a callback)
Adapter
DataAdapter
Decorator
Query

Compatibility with <input type="text" />

Deprecated in Select2 4.0. It is now encouraged to use the <select> tag instead.

In past versions of Select2, a <select> element could only be used with a limited subset of options. An <input type="hidden" /> was required instead, which did not allow for a graceful fallback for users who did not have JavaScript enabled. Select2 now supports the <select> element for all options, so it is no longer required to use <input /> elements with Select2.

Adapter
DataAdapter
Decorator
InputData