Трохи пізно, але для того, що варто, я реалізував більш складну функцію, яку ви можете включити загалом. У ньому є кілька варіантів для різноманітних результатів. Він також може перетворитися на <OPTGROUP>
теги на основі їх мітки.
$.fn.sortSelect = function(options){
const OPTIONS_DEFAULT = {
recursive: true,
reverse: false,
useValues: false,
blankFirst: true,
}
if (typeof options != "object" || null === options) {
options = OPTIONS_DEFAULT;
}
var sortOptions = function($root, $node, options){
if ($node.length != 1) {
return false;
}
if ($node[0].tagName != "SELECT" && $node[0].tagName != "OPTGROUP") {
return false;
}
if (options.recursive) {
$node.children('optgroup').each(function(k, v){
return sortOptions($root, $(v), options);
});
}
var $options = $node.children('option, optgroup');
var $optionsSorted = $options.sort(function(a, b){
if (options.blankFirst) {
if (a.tagName == "OPTION" && a.value == "") {
return -1;
}
if (b.tagName == "OPTION" && b.value == "") {
return 1;
}
}
var textA = (a.tagName == "OPTION" ? (options.useValues ? a.value : a.text) : a.label);
var textB = (b.tagName == "OPTION" ? (options.useValues ? a.value : b.text) : b.label);
if (textA > textB) {
return options.reverse ? -1 : 1;
}
if (textA < textB) {
return options.reverse ? 1 : -1;
}
return 0;
});
$options.remove();
$optionsSorted.appendTo($node);
return true;
};
var selected = $(this).val();
var sorted = sortOptions($(this), $(this), {...OPTIONS_DEFAULT, ...options});
$(this).val(selected);
return sorted;
};
Потім ви можете викликати sortSelect()
функцію на будь-якому <SELECT>
тезі або просто на одному, <OPTGROUP>
щоб лише відсортувати параметри групи.
Приклад:
$('select').sortSelect();
Зворотне замовлення за допомогою опції "зворотний":
$('select').sortSelect({
reverse: true
});
Ви можете застосувати це до всіх вибраних автоматично, можливо, лише якщо вони включають важливий клас (наприклад, "js-sort") із цим:
$('select.js-sort').each(function(k, v){
$(v).sortSelect();
});