什么是最有效的方法来按值sortingHtml Select的选项,同时保留当前select的项目?
我有jQuery,但我不确定是否有任何内置的sorting助手。 我可以做一个每个项目的text
, value
和selected
属性的二维数组,但我不认为在Array.sort()
构build的JavaScript将正常工作。
将选项提取到临时数组中,进行sorting,然后重build列表:
var my_options = $("#my_select option"); var selected = $("#my_select").val(); my_options.sort(function(a,b) { if (a.text > b.text) return 1; if (a.text < b.text) return -1; return 0 }) $("#my_select").empty().append( my_options ); $("#my_select").val(selected);
Mozilla的sorting文档 (特别是compareFunction)和维基百科的Sorting Algorithm页面是相关的。
如果要使sorting不区分大小写,请用text.toLowerCase()
replacetext
上面显示的sortingfunction说明了如何sorting。 准确地排列非英语语言可能会很复杂(请参阅unicodesortingalgorithm )。 在sortingfunction中使用localeCompare是一个很好的解决scheme,例如:
my_options.sort(function(a,b) { return a.text.localeCompare(b.text); });
稍微修改了Tom的答案,以便它实际上修改了要sorting的select框的内容,而不仅仅是返回sorting后的元素。
$('#your_select_box').sort_select_box();
jQuery函数:
$.fn.sort_select_box = function(){ // Get options from select box var my_options = $("#" + this.attr('id') + ' option'); // sort alphabetically my_options.sort(function(a,b) { if (a.text > b.text) return 1; else if (a.text < b.text) return -1; else return 0 }) //replace with sorted my_options; $(this).empty().append( my_options ); // clearing any selections $("#"+this.attr('id')+" option").attr('selected', false); }
我只是用jquery函数来包装Mark的想法
$('#your_select_box').sort_select_box();
JQuery函数:
$.fn.sort_select_box = function(){ var my_options = $("#" + this.attr('id') + ' option'); my_options.sort(function(a,b) { if (a.text > b.text) return 1; else if (a.text < b.text) return -1; else return 0 }) return my_options; }
我在@Juan Perez的评论中提到的解决scheme
$.fn.sortOptions = function(){ $(this).each(function(){ var op = $(this).children("option"); op.sort(function(a, b) { return a.text > b.text ? 1 : -1; }) return $(this).empty().append(op); }); }
用法:
$("select").sortOptions();
这仍然可以改善,但我不需要添加任何更多的钟声或口哨:)
有一个封闭的jQuery票据应该工作,但只是没有包括在核心。
jQuery.fn.sort = function() { return this.pushStack( [].sort.apply( this, arguments ), []); };
从Google Groups的线程引用,我认为你只是传递一个用来sorting的函数,像这样
function sortSelect(selectToSort) { jQuery(selectToSort.options).sort(function(a,b){ return a.value > b.value ? 1 : -1; }); }
希望它有帮助!
那么,在IE6中,它似乎sorting在嵌套数组的[0]项目:
function sortSelect(selectToSort) { var arrOptions = []; for (var i = 0; i < selectToSort.options.length; i++) { arrOptions[i] = []; arrOptions[i][0] = selectToSort.options[i].value; arrOptions[i][1] = selectToSort.options[i].text; arrOptions[i][2] = selectToSort.options[i].selected; } arrOptions.sort(); for (var i = 0; i < selectToSort.options.length; i++) { selectToSort.options[i].value = arrOptions[i][0]; selectToSort.options[i].text = arrOptions[i][1]; selectToSort.options[i].selected = arrOptions[i][2]; } }
我会看看,如果这在其他浏览器中工作…
编辑:它也适用于Firefox,呜呼!
有没有比这更简单的方法呢? 有没有一些方法内置到JavaScript或jQuerysortingselect我缺less,或者这是最好的方法?
这是一个更好的解决scheme。 向JQuery声明一个全局函数
$.fn.sortSelect = function() { var op = this.children("option"); op.sort(function(a, b) { return a.text > b.text ? 1 : -1; }) return this.empty().append(op); }
并从代码中调用该函数。
$("#my_select").sortSelect();
Array.sort()
默认将每个元素转换为一个string,然后比较这些值。 所以["value", "text", "selected"]
被sorting为"value, text, selected"
。 在大多数情况下,这可能会工作得很好。
如果你想单独对值进行sorting,或者将值解释为数字,那么你可以将一个比较函数传递给sort():
arrOptions.sort(function(a,b) { return new Number(a[0]) - new Number(b[0]); });
记住:如果你想使用上下文select器,只是连接ID将无法正常工作
$.fn.sort_select_box = function(){ var my_options = $("option", $(this)); my_options.sort(function(a,b) { if (a.text > b.text) return 1; else if (a.text < b.text) return -1; else return 0 }); $(this).empty().append(my_options); } // Usando: $("select#ProdutoFornecedorId", $($context)).sort_select_box();
var arrOptions = []; var i = 0; sel.find("option").each(function(){ arrOptions[i] = []; arrOptions[i][0] = jQuery(this).text(); arrOptions[i][1] = jQuery(this); i += 1; }); arrOptions.sort(); for(var i=0;i<arrOptions.length;i++){ sel.append(arrOptions[i][1]); }