थोड़ा देर से लेकिन इसके लायक मैं एक और अधिक जटिल कार्य को कार्यान्वित कर चुका हूं आप उदारतापूर्वक शामिल कर सकते हैं। इसमें विभिन्न आउटपुट के लिए कुछ विकल्प हैं। यह <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();
});