2015-02-27 3 views
9

Я хочу отсортировать опции select2 в алфавитном порядке. У меня есть следующий код и хотелось бы знать, как это можно добиться.Как отсортировать параметры select2 (plugin) в алфавитном порядке?

<select name="list" id="mylist" style="width:140px;"> 
    <option>United States</option> 
    <option>Austria</option> 
    <option>Alabama</option>  
    <option>Jamaica</option> 
    <option>Taiwan</option> 
    <option>canada</option> 
    <option>palau</option> 
    <option>Wyoming</option> 
</select> 


$('#mylist').select2({ 
    sortResults: function(results) { return results.sort(); } 
}); 

Я хочу, чтобы отсортировать данные через 'текст' ...

ответ

11

Использование опций Select2 API v3.x - sortResults

Вы можете сортировать элементы с помощью опции sortResults обратного вызова:

$('#mylist').select2({ 
 
    sortResults: function(data) { 
 
     /* Sort data using lowercase comparison */ 
 
     return data.sort(function (a, b) { 
 
      a = a.text.toLowerCase(); 
 
      b = b.text.toLowerCase(); 
 
      if (a > b) { 
 
       return 1; 
 
      } else if (a < b) { 
 
       return -1; 
 
      } 
 
      return 0; 
 
     }); 
 
    } 
 
});
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/3.5.4/select2.min.css" integrity="sha256-ijlUKKj3hJCiiT2HWo1kqkI79NTEYpzOsw5Rs3k42dI=" crossorigin="anonymous" /><script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/select2/3.5.4/select2.min.js" integrity="sha256-7A2MDY2eGSSUvgfbuH1IdzYk8qkEd3uzwiXADqPDdtY=" crossorigin="anonymous"></script> 
 
<select name="list" id="mylist" style="width:140px;"> 
 
    <option>United States</option> 
 
    <option>Austria</option> 
 
    <option>Alabama</option>  
 
    <option>Jamaica</option> 
 
    <option>Taiwan</option> 
 
    <option>canada</option> 
 
    <option>palau</option> 
 
    <option>Wyoming</option> 
 
</select>

Использование ВЫБ.2 options API v4.0 - sort

Вы можете сортировать элементы с помощью опции sorter обратного вызова:

$('#mylist').select2({ 
 
    sorter: function(data) { 
 
     /* Sort data using lowercase comparison */ 
 
     return data.sort(function (a, b) { 
 
      a = a.text.toLowerCase(); 
 
      b = b.text.toLowerCase(); 
 
      if (a > b) { 
 
       return 1; 
 
      } else if (a < b) { 
 
       return -1; 
 
      } 
 
      return 0; 
 
     }); 
 
    } 
 
});
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/css/select2.css" integrity="sha256-xqxV4FDj5tslOz6MV13pdnXgf63lJwViadn//ciKmIs=" crossorigin="anonymous" /><script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/js/select2.min.js" integrity="sha256-FA14tBI8v+/1BtcH9XtJpcNbComBEpdawUZA6BPXRVw=" crossorigin="anonymous"></script> 
 
<select name="list" id="mylist" style="width:140px;"> 
 
    <option>United States</option> 
 
    <option>Austria</option> 
 
    <option>Alabama</option>  
 
    <option>Jamaica</option> 
 
    <option>Taiwan</option> 
 
    <option>canada</option> 
 
    <option>palau</option> 
 
    <option>Wyoming</option> 
 
</select>


Чистый JavaScript (старый ответ)

У меня была другая общая цель подхода (вы можете использовать значение или атрибут для сортировки элементов), но без использования JQuery:

var select = document.getElementById("mylist"); 
 
var options = []; 
 
// Get elements to sort 
 
for (var i in select.childNodes) { 
 
    var tagName = select.childNodes[i].tagName; 
 
    if (typeof(tagName) != 'undefined' && 
 
     tagName.toLowerCase() == "option") { 
 
     /* Field "content" will be used to sort options */ 
 
     options.push({ 
 
      node: select.childNodes[i], 
 
      content: select.childNodes[i].innerHTML, 
 
     }); 
 
    } 
 
} 
 
// Empty select 
 
while (select.firstChild) { 
 
    select.removeChild(select.firstChild); 
 
} 
 
// Sort function 
 
function sort(a, b){ 
 
    var aa = a.content.toLowerCase(); 
 
    var bb = b.content.toLowerCase(); 
 
    if(aa > bb) { 
 
     return 1; 
 
    } else if (aa < bb) { 
 
     return -1; 
 
    } 
 
    return 0; 
 
} 
 
// Sort array using previous function 
 
options.sort(sort); 
 
// Add the nodes again in order 
 
for (var i in options) { 
 
    select.appendChild(options[i].node); 
 
}
<select name="list" id="mylist" style="width:140px;"> 
 
    <option>United States</option> 
 
    <option>Austria</option> 
 
    <option>Alabama</option>  
 
    <option>Jamaica</option> 
 
    <option>Taiwan</option> 
 
    <option>canada</option> 
 
    <option>palau</option> 
 
    <option>Wyoming</option> 
 
</select>

С JQuery

var selectList = $('#mylist option'); 
 
function sort(a,b){ 
 
    a = a.text.toLowerCase(); 
 
    b = b.text.toLowerCase(); 
 
    if(a > b) { 
 
     return 1; 
 
    } else if (a < b) { 
 
     return -1; 
 
    } 
 
    return 0; 
 
} 
 
selectList.sort(sort); 
 
$('#mylist').html(selectList);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script> 
 
<select name="list" id="mylist" style="width:140px;"> 
 
    <option>United States</option> 
 
    <option>Austria</option> 
 
    <option>Alabama</option>  
 
    <option>Jamaica</option> 
 
    <option>Taiwan</option> 
 
    <option>canada</option> 
 
    <option>palau</option> 
 
    <option>Wyoming</option> 
 
</select>

Благодаря @Narendra Sisodia для JQuery наконечника.

С уважением!

3

Выбор2 версия 4.0 переименовала sortResults в sorter, так что вы можете сделать:

$('#input').select2({ 
    sorter: function(data) { 
     return data.sort(); 
    } 
}) 
+0

Я попробовал это, но это не сортирует первоначальный список, если он не в алфавитном порядке. Кроме того, я считаю, что вам нужно предоставить функцию сортировки как параметр, который будет выполнять сравнение, как это сделал @OscarGarcia. –

+3

На https://github.com/select2/select2/issues/3195#issuecomment-256938416 есть более подробная версия, которая сортируется по алфавиту и работает в моем случае. – Christoph

Смежные вопросы