使用javascript对html列表进行排序

时间:2012-01-12 15:01:55

标签: javascript jquery html sorting html-lists

我有一组三个列表项,我想在页面加载时从高到低自动显示。理想情况下使用jquery或javascript。

<ul class="list">
<li id="alpha">32</li>
<li id="beta">170</li>
<li id="delta">28</li>
</ul>

每个列表项都需要自己的ID,因为它们每个都有单独的背景图像。数字必须是文本节点,以便用户可以编辑它们。

11 个答案:

答案 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并将其传递给它。

Example JSFiddle

修改

由于你提到你希望它发生在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导致

  1. 它的轻量级[仅3K脚本]
  2. 使用类
  3. 在现有HTML表格中轻松实现
  4. 可搜索,可排序和可过滤
  5. <强> 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);
});

实例:http://jsfiddle.net/B7hdx/1

答案 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/

解释它的工作原理:

  1. 获取.list父对象。
  2. 找到所有<li>子对象。
  3. 它从DOM中删除所有<li>子对象,但保留其数据
  4. 使用自定义排序功能对li对象进行排序
  5. 自定义排序功能获取li标签中的HTML并将其转换为数字
  6. 然后,以新排序的顺序遍历数组,每个li标签将附加回原始父标记。
  7. 结果是它们按排序顺序显示。

    修改

    这个改进的版本甚至可以同时对多个列表对象进行排序:

    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");
    

    演示:http://jsfiddle.net/jfriend00/RsLwX/

答案 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);    
}));

这是working example

答案 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);
}

小提琴证明:https://jsfiddle.net/L27gpnh6/1/

答案 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]);
}

Fiddle Link

答案 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');

http://jsfiddle.net/zMmWj/