Hơi muộn nhưng vì những gì đáng giá, tôi đã triển khai một chức năng phức tạp hơn mà bạn có thể đưa vào một cách chung chung. Nó có một số tùy chọn cho đầu ra khác nhau. Nó cũng có thể đệ quy thành <OPTGROUP>
các thẻ dựa trên nhãn của chúng.
$.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;
};
Sau đó, bạn có thể gọi sortSelect()
hàm trên bất kỳ <SELECT>
thẻ nào hoặc chỉ một thẻ <OPTGROUP>
để chỉ sắp xếp các tùy chọn của một nhóm.
Thí dụ:
$('select').sortSelect();
Đảo ngược thứ tự bằng cách sử dụng tùy chọn "đảo ngược":
$('select').sortSelect({
reverse: true
});
Bạn có thể áp dụng điều này cho tất cả các lựa chọn tự động, có lẽ chỉ khi chúng bao gồm một lớp quan trọng (ví dụ: "js-sort") với cái này:
$('select.js-sort').each(function(k, v){
$(v).sortSelect();
});