我有点力不从心,我希望这是可能的。
我希望能够调用一个函数,该函数将按字母顺序对列表中的所有项进行排序。
我一直在寻找通过jQuery UI排序,但这似乎不是它。任何想法吗?
我有点力不从心,我希望这是可能的。
我希望能够调用一个函数,该函数将按字母顺序对列表中的所有项进行排序。
我一直在寻找通过jQuery UI排序,但这似乎不是它。任何想法吗?
当前回答
将列表放入一个数组中,使用JavaScript的.sort(),它默认是按字母顺序排列的,然后将数组转换回列表。
http://www.w3schools.com/jsref/jsref_sort.asp
其他回答
就像这样:
var mylist = $('#myUL');
var listitems = mylist.children('li').get();
listitems.sort(function(a, b) {
return $(a).text().toUpperCase().localeCompare($(b).text().toUpperCase());
})
$.each(listitems, function(idx, itm) { mylist.append(itm); });
来自本页:http://www.onemoretake.com/2009/02/25/sorting-elements-with-jquery/
以上代码将使用id 'myUL'对无序列表进行排序。
或者你也可以使用TinySort这样的插件。https://github.com/Sjeiti/TinySort
你不需要jQuery来做这个…
function sortUnorderedList(ul, sortDescending) {
if(typeof ul == "string")
ul = document.getElementById(ul);
// Idiot-proof, remove if you want
if(!ul) {
alert("The UL object is null!");
return;
}
// Get the list items and setup an array for sorting
var lis = ul.getElementsByTagName("LI");
var vals = [];
// Populate the array
for(var i = 0, l = lis.length; i < l; i++)
vals.push(lis[i].innerHTML);
// Sort it
vals.sort();
// Sometimes you gotta DESC
if(sortDescending)
vals.reverse();
// Change the list on the page
for(var i = 0, l = lis.length; i < l; i++)
lis[i].innerHTML = vals[i];
}
易于使用…
sortUnorderedList("ID_OF_LIST");
现场演示→
为了使这个工作在包括Chrome在内的所有浏览器中工作,你需要使sort()的回调函数返回-1、0或1。
参见http://inderpreetsingh.com/2010/12/01/chromes-javascript-sort-array-function-is-different-yet-proper/
function sortUL(selector) {
$(selector).children("li").sort(function(a, b) {
var upA = $(a).text().toUpperCase();
var upB = $(b).text().toUpperCase();
return (upA < upB) ? -1 : (upA > upB) ? 1 : 0;
}).appendTo(selector);
}
sortUL("ul.mylist");
将列表放入一个数组中,使用JavaScript的.sort(),它默认是按字母顺序排列的,然后将数组转换回列表。
http://www.w3schools.com/jsref/jsref_sort.asp
改进基于Jeetendra Chauhan的回答
$('ul.menu').each(function(){
$(this).children('li').sort((a,b)=>a.innerText.localeCompare(b.innerText)).appendTo(this);
});
为什么我认为这是一个进步:
using each to support running on more than one ul using children('li') instead of ('ul li') is important because we only want to process direct children and not descendants using the arrow function (a,b)=> just looks better (IE not supported) using vanilla innerText instead of $(a).text() for speed improvement using vanilla localeCompare improves speed in case of equal elements (rare in real life usage) using appendTo(this) instead of using another selector will make sure that even if the selector catches more than one ul still nothing breaks