我有一组三个列表项,我想在页面加载时从高到低自动显示。理想情况下使用jquery或javascript。
<ul class="list">
<li id="alpha">32</li>
<li id="beta">170</li>
<li id="delta">28</li>
</ul>
每个列表项都需要自己的ID,因为它们每个都有单独的背景图像。数字必须是文本节点,以便用户可以编辑它们。
答案 0 :(得分:18)
这可能是最快的方法,因为它不使用jQuery:
function sortList(ul){
var new_ul = ul.cloneNode(false);
// Add all lis to an array
var lis = [];
for(var i = ul.childNodes.length; i--;){
if(ul.childNodes[i].nodeName === 'LI')
lis.push(ul.childNodes[i]);
}
// Sort the lis in descending order
lis.sort(function(a, b){
return parseInt(b.childNodes[0].data , 10) -
parseInt(a.childNodes[0].data , 10);
});
// Add them into the ul in order
for(var i = 0; i < lis.length; i++)
new_ul.appendChild(lis[i]);
ul.parentNode.replaceChild(new_ul, ul);
}
调用函数:
sortList(document.getElementsByClassName('list')[0]);
您可以使用相同的方式对其他列表进行排序,如果您在列表类的同一页面上有其他元素,则应该为您的ul指定一个id并将其传递给它。
修改强>
由于你提到你希望它发生在pageLoad上,我假设你希望它在DOM在DOM之后尽快发生,这意味着你应该将函数sortList
添加到页面的头部并在您的列表后立即使用它:
<head>
...
<script type="text/javascript">
function sortList(ul){
var new_ul = ul.cloneNode(false);
var lis = [];
for(var i = ul.childNodes.length; i--;){
if(ul.childNodes[i].nodeName === 'LI')
lis.push(ul.childNodes[i]);
}
lis.sort(function(a, b){
return parseInt(b.childNodes[0].data , 10) - parseInt(a.childNodes[0].data , 10);
});
for(var i = 0; i < lis.length; i++)
new_ul.appendChild(lis[i]);
ul.parentNode.replaceChild(new_ul, ul);
}
</script>
</head>
<body>
...
<ul class="list">
<li id="alpha">32</li>
<li id="beta">170</li>
<li id="delta">28</li>
</ul>
<script type="text/javascript">
!function(){
var uls = document.getElementsByTagName('ul');
sortList( uls[uls.length - 1] );
}();
</script>
...
</body>
答案 1 :(得分:6)
您可以使用此轻量级jquery插件List.js导致
<强> HTML 强>
<div id="my-list">
<ul class="list">
<li>
<h3 class="name">Luke</h3>
</li>
<li>
<h3 class="name">John</h3>
</li>
</ul>
</div>
<强>的Javascript 强>
var options = {
valueNames: ['name']
};
var myList = new List('my-list', options);
答案 2 :(得分:5)
你可以试试这个
var ul = $(".list:first");
var arr = $.makeArray(ul.children("li"));
arr.sort(function(a, b) {
var textA = +$(a).text();
var textB = +$(b).text();
if (textA < textB) return -1;
if (textA > textB) return 1;
return 0;
});
ul.empty();
$.each(arr, function() {
ul.append(this);
});
答案 3 :(得分:3)
此代码将对该列表进行排序,假设只有一个.list
项:
function sortList(selector) {
var parent$ = $(selector);
parent$.find("li").detach().sort(function(a, b) {
return(Number(a.innerHTML) - Number(b.innerHTML));
}).each(function(index, el) {
parent$.append(el);
});
}
sortList(".list");
您可以在此处查看:http://jsfiddle.net/jfriend00/FjuMB/
解释它的工作原理:
<li>
子对象。<li>
子对象,但保留其数据结果是它们按排序顺序显示。
修改强>
这个改进的版本甚至可以同时对多个列表对象进行排序:
function sortList(selector) {
$(selector).find("li").sort(function(a, b) {
return(Number(a.innerHTML) - Number(b.innerHTML));
}).each(function(index, el) {
$(el).parent().append(el);
});
}
sortList(".list");
答案 4 :(得分:3)
还有this small jQuery plugin。这将使你的排序不过是:
$('.list>li').tsort({attr:'id'});
答案 5 :(得分:1)
一种方法可以是sort an array(以及jQuery对象)的li
元素,并替换ul
的内容(使用html
方法)排序的元素数组:
$(".list").html($(".list li").sort(function(a, b) {
return parseInt($(b).text(), 10) - parseInt($(a).text(), 10);
}));
答案 6 :(得分:1)
这样的事情应该会有所帮助:
var $parent = $(".list");
$(".list li").sort(function (a, b) {
return window.parseInt($(a).text(), 10) - window.parseInt($(b).text(), 10);
}).remove().each(function () {
$parent.append($(this));
});
答案 7 :(得分:1)
非jquery版本(vanilla javascript)
好处:列表已按位排序,不会破坏LI,也不会删除可能与它们相关的任何事件。它只会改变周围的事物
在UL中添加了一个ID:
<ul id="myList" class="list">
<li id="alpha">32</li>
<li id="beta">170</li>
<li id="delta">28</li>
</ul>
和vanilla javascript(没有jquery)
// Grab a reference to the UL
var container = document.getElementById("myList");
// Gather all the LI's from the container
var contents = container.querySelectorAll("li");
// The querySelector doesn't return a traditional array
// that we can sort, so we'll need to convert the contents
// to a normal array.
var list = [];
for(var i=0; i<contents.length; i++){
list.push(contents[i]);
}
// Sort based on innerHTML (sorts "in place")
list.sort(function(a, b){
var aa = parseInt(a.innerHTML);
var bb = parseInt(b.innerHTML);
return aa < bb ? -1 : (aa > bb ? 1 : 0);
});
// We'll reverse the array because our shuffle runs backwards
list.reverse();
// Shuffle the order based on the order of our list array.
for(var i=0; i<list.length; i++){
console.log(list[i].innerHTML);
container.insertBefore(list[i], container.firstChild);
}
答案 8 :(得分:0)
使用jQuery寻求帮助:
var sortFunction = function(a, b) {
return (+($(b).text())) - (+($(a).text()));
}
var lis = $('ul.list li');
lis = Array.prototype.sort.call(lis, sortFunction);
for (var i = 0; i < lis.length; i++) {
$('ul.list').append(lis[i]);
}
答案 9 :(得分:0)
您可以使用此方法:
var mylist = $('ul');
var listitems = mylist.children('li').get();
listitems.sort(function(a, b) {
var compA = $(a).text().toUpperCase();
var compB = $(b).text().toUpperCase();
return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;
})
$.each(listitems, function(idx, itm) { mylist.append(itm); });
查看此处的文章: http://www.onemoretake.com/2009/02/25/sorting-elements-with-jquery/
编辑:有一个非常酷的jquery插件可以做到:http://tinysort.sjeiti.com/
答案 10 :(得分:0)
按常规数组排序jQuery集合,然后按正确的顺序追加每个元素。
$(".list li").sort(function(a, b) {
return parseInt($(b).text(), 10) - parseInt($(a).text(), 10);
}).appendTo('.list');