How to get Selected Text from select2 when using <input>

I am using the select2 control, loading data via ajax. This requires the use of the <input type=hidden..> tag.

Now, I want to retrieve the selected text. (The value property in the data-bind expression sotres the id only)

I have tried $(".select2-chosen").text(), but this breaks when I have multiple select2 controls on the page.


As of Select2 4.x, it always returns an array, even for non-multi select lists.

var data = $('your-original-element').select2('data')

For Select2 3.x and lower

Single select:

var data = $('your-original-element').select2('data');
if(data) {

Note that when there is no selection, the variable 'data' will be null.

Multi select:

var data = $('your-original-element').select2('data')

From the 3.x docs:

data Gets or sets the selection. Analogous to val method, but works with objects instead of ids.

data method invoked on a single-select with an unset value will return null, while a data method invoked on an empty multi-select will return [].

I finally figured it out doing this:

var $your-original-element = $('.your-original-element');
var data = $your-original-element.select2('data')[0]['text'];

if you also want the value:

var value = $your-original-element.select2('data')[0]['id'];

Also you can have the selected value using following code:

alert("Selected option value is: "+$('#SelectelementId').select2("val"));

The code below also solves otherwise

.on("change", function(e) {

  var lastValue = e.currentTarget.value;
  var lastText = e.currentTarget.textContent;


Again I suggest Simple and Easy

Its Working Perfect with ajax when user search and select it saves the selected information via ajax

   ajax: {
  dataType: 'json',
  delay: 250,
  data: function (params) {
  return {
    q: params.term, // search term
processResults: function (data, params) {
  // parse the results into the format expected by Select2
  // since we are using custom formatting functions we do not need to
  // alter the remote JSON data, except to indicate that infinite
  // scrolling can be used = || 1;

  return {
    results: data,
    pagination: {
      more: ( * 30) < data.total_count
cache: true
escapeMarkup: function (markup) { return markup; }, // let our custom    formatter work
minimumInputLength: 1,
}).on("change", function(e) {

  var lastValue = $("#vendor-brands option:last-child").val();
  var lastText = $("#vendor-brands option:last-child").text();

  alert(lastValue+' '+lastText);

The correct way to do this as of v4 is:


It is undocumented so could break in the future without warning.

You will probably want to check if there is a selection first however:

var s = $('.select2-chosen');

if(s.select2('data') && !!s.select2('data')[0]){
    //do work

This one is working fine using V 4.0.3

var vv = $('.mySelect2');     
var label = $(vv).children("option[value='"+$(vv).select2("val")+"']").first().html();

Need Your Help

Find out who is locking a file on a network share

windows locking

I want to known who is locking a file on a network share.

How to access form methods and controls from a class in C#?

c# winforms

I'm working on a C# program, and right now I have one Form and a couple of classes. I would like to be able to access some of the Form controls (such as a TextBox) from my class. When I try to chan...