当前位置: 代码迷 >> JavaScript >> JavaScript 怎么实现页面既有的数据的排序
  详细解决方案

JavaScript 怎么实现页面既有的数据的排序

热度:110   发布时间:2012-04-15 18:39:21.0
JavaScript 如何实现页面既有的数据的排序.
现在又一个页面,里面有个table表数据,大致的表格如下

-------------------------------
| 姓名 | ..... | 得分 |
--------------------------------
| 张三 | ..... | 1000 |
--------------------------------
| 李四 | ..... | 4490 |
--------------------------------
| 王五 | ..... | 8760 |
--------------------------------
这里的得分人员手工打分的,现在的需求就是,当把这些人的得分都打好以后,
我点击一个按钮,这个按钮实现的功能就是: 将这些数据按照得分由高到低的顺序
排个序。这是PM要求的,我JS不在行,我说我在后台做吧,他说就用JS 省资源,顺便
让我学习一下,求朋友们给答案,就是那个按钮的具体代码活着详细的思路也行。

------解决方案--------------------
HTML code

<!doctype html>
<html>
    <head>
        <meta charset="gb2312" />
        <title></title>
        <style>
        </style>
    </head>
    <body>
        <ul id="ul">
            <li>小王<em>74</em></li>
            <li>小李<em>65</em></li>
            <li>小张<em>56</em></li>
            <li>小周<em>84</em></li>
            <li>小艾<em>63</em></li>
        </ul>
        <script>
            function $(o){return document.getElementById(o)}
            function makeArray( obj ){
                var arr = [];
                for ( var i = 0, len = obj.length; i < len; i++ ){
                    arr.push(obj[i]);
                }
                return arr;
            }
            function asc( x, y ){ //升序
                return parseInt( x.innerHTML ) - parseInt( y.innerHTML );
            }

            function makeOrder( wrapper, obj, order ){
                var order = order || 'asc';
                var wrapper = $( wrapper );
                var obj = wrapper.getElementsByTagName( obj );
                var arr;    
                arr = makeArray( obj ); // 将对象转为数组
                if ( order == 'asc' ){
                    arr.sort( asc );
                } else {
                    arr.sort( asc ).reverse();
                }    
                for( var i = 0, len = arr.length; i < len; i++ ){
                    wrapper.appendChild( arr[i].parentNode )
                }
            }
            
            makeOrder( 'ul', 'em', 'asc' )
            
            
            
            
        </script>
    </body>
</html>

------解决方案--------------------
HTML code

<ul id="ul">
    <li>小王<em>74</em></li>
    <li>小李<em>65</em></li>
    <li>小张<em>56</em></li>
    <li>小周<em>84</em></li>
    <li>小艾<em>63</em></li>
</ul>
<input type="button" value="TEST" onclick="sortTable()">

<script type=text/javascript>
function sortTable() {
    var obj = document.getElementById("ul");
    var arr = obj.innerHTML.match(/<li.*?\/em>/gi); //注意:IE浏览器innerHTML会遗漏n-1个“</li>”标签
    arr.sort(function(a, b) {
        var reg = function(o){return o.replace(/(?![^>]+(?=<\/)).+?/g, "")};
        return reg(b) - reg(a)
    });
    obj.innerHTML = arr.join("</li>") + "</li>";
}
</script>

------解决方案--------------------
var reg = reg || function(o){return o.replace(/(?![^>]+(?=<\/)).+?/g, "")};
------解决方案--------------------
HTML code
<!DOCTYPE html>
<html>
<head>
    <title>Test</title>
    <style>
        table{
            width: 600px;
            border-collapse:collapse;
            text-align: center;
        }
        
        table,th, td{
            border: 1px solid black;
        }
        td input{
            width: 100%;
            border: none;
        }
    </style>
</head>
<body>
    <form>
        <table>
            <thead>
                <tr>
                    <th>姓名</th>
                    <th>得分</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>张三</td>
                    <td><input class="score" type="text" value="0" /></td>
                </tr>
                <tr>
                    <td>李四</td>
                    <td><input class="score" type="text" value="0" /></td>
                </tr>
                <tr>
                    <td>王五</td>
                    <td><input class="score" type="text" value="0" /></td>
                </tr>
            </tbody>
        </table>
        <input id="order_btn" type="button" value="order"/>
    </form>
    <script>
        document.getElementById("order_btn").onclick = function(){
            var callee = arguments.callee;
            if(!callee.tableOrder){
                callee.tableOrder = new TableOrder(this.parentNode.getElementsByTagName("table")[0]);
            }
            callee.tableOrder.makeOrder("score", "asc");
        }
        function TableOrder(table){
            this.init = function(){
                this.tbody = table.getElementsByTagName("tbody")[0];
                this.trs = this.tbody.children;
            }
            this.makeOrder = function(clazz, order){
                var arr = Array.prototype.slice.call(this.trs, 0);
                arr.sort(function(arg1, arg2){
                    var factor = 1, value1 = 0, value2 = 0;
                    if(order === "asc"){
                        factor = 1;
                    }else if(order === "desc"){
                        factor = -1;
                    }
                    value1 = parseInt(getElementsByClassName(arg1, clazz)[0].value);
                    value2 = parseInt(getElementsByClassName(arg2, clazz)[0].value);
                    console.log((value1 - value2) * factor);
                    return (value1 - value2) * factor;
                });
                var fragment = document.createDocumentFragment();
                for(var i = 0, len = arr.length; i < len; i++){
                    fragment.appendChild(arr[i]);
                }
                this.tbody.innerHTML = "";
                this.tbody.appendChild(fragment);
            }
            function getElementsByClassName(elem, clazz){
                if(elem.getElementsByClassName){
                    return Array.prototype.slice.call(elem.getElementsByClassName(clazz), 0);
                }else{
                    var childrens = elem.getElementsByTagName("*"),
                        reg = new RegExp("\b" + clazz + "\b"),
                        result = [];
                    reg.complie();
                    for(var i = 0, len = childrens.length; i < len; i++){
                        if(reg.test(childrens[i].className)){
                            result.push(childrens[i]);
                        }
                    }
                    return result;
                }
            }
            this.init();
        }
    </script>
</body>
</html>
 
  相关解决方案