Ein bisschen spät, aber für das, was es wert ist, habe ich eine komplexere Funktion implementiert, die Sie generisch einschließen können. Es gibt einige Optionen für eine abwechslungsreiche Ausgabe. Es kann auch auf <OPTGROUP>
Tags basierend auf ihrer Bezeichnung zurückgreifen .
$.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;
};
Sie können die sortSelect()
Funktion dann für jedes <SELECT>
Tag oder nur für ein einzelnes Tag aufrufen , <OPTGROUP>
um nur die Optionen einer Gruppe zu sortieren.
Beispiel:
$('select').sortSelect();
Umgekehrte Reihenfolge mit der Option "Umkehren":
$('select').sortSelect({
reverse: true
});
Sie können dies automatisch auf alle Auswahlen anwenden, möglicherweise nur, wenn sie eine wichtige Klasse (z. B. "js-sort") enthalten:
$('select.js-sort').each(function(k, v){
$(v).sortSelect();
});