HTML如下:

复制代码
<table class="heroinfo">
    <thead title="点击排序">
        <tr>
            <th>英雄th><th>力量th><th>敏捷th><th>智力th><th>移速th>
        tr>
    thead>
    <tbody>
        <tr>
            <td>英雄1td><td>28td><td>32td><td>20td><td>300td>
        tr>
        <tr>
            <td>英雄2td><td>29td><td>22td><td>30td><td>320td>
        tr>
        <tr>
            <td>英雄3td><td>25td><td>30td><td>25td><td>310td>
        tr>
        <tr>
            <td>英雄4td><td>33td><td>28td><td>22td><td>305td>
        tr>
        <tr>
            <td>英雄5td><td>27td><td>36td><td>20td><td>330td>
        tr>
    tbody>
table>
复制代码

效果如下:

一、原生JS实现:来自JS权威指南,比书上多了再次点击后逆序排列的功能

复制代码
//查找表格的元素,让它们可单击
function makeSortable(table) {
    var headers=table.getElementsByTagName("th");
    for(var i=0;i){
        (function(n){
            var flag=false;
            headers[n].onclick=function(){
                // sortrows(table,n);
                var tbody=table.tBodies[0];//第一个
                var rows=tbody.getElementsByTagName("tr");//tbody中的所有行
                rows=Array.prototype.slice.call(rows,0);//真实数组中的快照

                //基于第n个元素的值对行排序
                rows.sort(function(row1,row2){
                    var cell1=row1.getElementsByTagName("td")[n];//获得第n个单元格
                    var cell2=row2.getElementsByTagName("td")[n];
                    var val1=cell1.textContent||cell1.innerText;//获得文本内容
                    var val2=cell2.textContent||cell2.innerText;

                    if(val1<val2){
                        return -1;
                    }else if(val1>val2){
                        return 1;
                    }else{
                        return 0;
                    }
                });
                if(flag){
                    rows.reverse();
                }
                //在tbody中按它们的顺序把行添加到最后
                //这将自动把它们从当前位置移走,故没必要预先删除它们
                //如果还包含了除了的任何其他元素,这些节点将会悬浮到顶部位置
                for(var i=0;i){
                    tbody.appendChild(rows[i]);
                }

                flag=!flag;
            }
        }(i));
    }
}

window.onload=function(){
    var table=document.getElementsByTagName("table")[0];
    makeSortable(table);
}
复制代码

二、编写jQuery插件实现

复制代码
;(function($){
    $.fn.extend({
        "makeSortable":function(){
            var table=$(this),
                headers=table.find('th');
            for(var i=0,len=headers.length;i){
                (function(n){
                    var flag=false;
                    headers.eq(n).click(function() {
                        var tbody=table.children('tbody').eq(0);
                        var rows=tbody.children('tr');
                        rows=Array.prototype.slice.call(rows,0);

                        rows.sort(function(row1,row2){
                            var val1=$(row1).children('td').eq(n).text();
                            var val2=$(row2).children('td').eq(n).text();
                            if(val1>val2){
                                return 1;
                            }else if(val1<val2){
                                return -1;
                            }else{
                                return 0;
                            }
                        });

                        if(flag){
                            rows.reverse();
                        }

                        tbody.append(rows);
                        flag=!flag;
                    });
                }(i));
            }

            return this;
        }
    });
})(jQuery);

$(function(){
    $(".heroinfo").makeSortable();
});
复制代码

两种方法均能实现点击一次实现从小到大排序,再次点击从大到小排序。

posted @ 2017-01-21 01:17 ZhangCui 阅读(38) 评论(0) 编辑 收藏