zoukankan      html  css  js  c++  java
  • javascript: 带分组数据的Table表头排序

    如下图:

    要求:点击表头排序时,"分组"及"分组明细"的数据层次关系不变

    从网上找了一段常规的table排序,改了改,以满足“分组支持”,贴在这里备份

      1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      2 <html xmlns="http://www.w3.org/1999/xhtml">
      3 <head>
      4     <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
      5     <style type="text/css">
      6         .tbl-list, .tbl-list td, .tbl-list th {
      7             border: solid 1px #000;
      8             border-collapse: collapse;
      9             padding: 10px;
     10             margin: 15px;
     11         }
     12     </style>
     13     <script type="text/javascript" src="http://lib.sinaapp.com/js/jquery/1.7.2/jquery.min.js"></script>
     14     <title>table sort</title>
     15     <script type="text/javascript">
     16         //排序 tableId: 表的id,iCol:第几列 ;dataType:iCol对应的列显示数据的数据类型
     17         function sortAble(th, tableId, iCol, dataType) {
     18 
     19             var ascChar = "";
     20             var descChar = "";
     21 
     22             var table = document.getElementById(tableId);
     23 
     24             //排序标题加背景色
     25             for (var t = 0; t < table.tHead.rows[0].cells.length; t++) {
     26                 var th = $(table.tHead.rows[0].cells[t]);
     27                 var thText = th.html().replace(ascChar, "").replace(descChar, "");
     28                 if (t == iCol) {
     29                     th.css("background-color", "#ccc");
     30                 }
     31                 else {
     32                     th.css("background-color", "#fff");
     33                     th.html(thText);
     34                 }
     35 
     36             }
     37 
     38             var tbody = table.tBodies[0];
     39             var colRows = tbody.rows;
     40             var aTrs = new Array;
     41 
     42             //将得到的行放入数组,备用
     43             for (var i = 0; i < colRows.length; i++) {
     44                 //注:如果要求“分组明细不参与排序”,把下面的注释去掉即可
     45                 //if ($(colRows[i]).attr("group") != undefined) {
     46                     aTrs.push(colRows[i]);
     47                 //}
     48             }
     49 
     50 
     51             //判断上一次排列的列和现在需要排列的是否同一个。
     52             var thCol = $(table.tHead.rows[0].cells[iCol]);
     53             if (table.sortCol == iCol) {
     54                 aTrs.reverse();
     55             } else {
     56                 //如果不是同一列,使用数组的sort方法,传进排序函数
     57                 aTrs.sort(compareEle(iCol, dataType));
     58             }
     59 
     60             var oFragment = document.createDocumentFragment();
     61             for (var i = 0; i < aTrs.length; i++) {
     62                 oFragment.appendChild(aTrs[i]);
     63             }
     64             tbody.appendChild(oFragment);
     65 
     66             //记录最后一次排序的列索引
     67             table.sortCol = iCol;
     68 
     69             //给排序标题加“升序、降序” 小图标显示
     70             var th = $(table.tHead.rows[0].cells[iCol]);
     71             if (th.html().indexOf(ascChar) == -1 && th.html().indexOf(descChar) == -1) {
     72                 th.html(th.html() + ascChar);
     73             }
     74             else if (th.html().indexOf(ascChar) != -1) {
     75                 th.html(th.html().replace(ascChar, descChar));
     76             }
     77             else if (th.html().indexOf(descChar) != -1) {
     78                 th.html(th.html().replace(descChar, ascChar));
     79             }
     80 
     81             //重新整理分组
     82             var subRows = $("#" + tableId + " tr[parent]");
     83             for (var t = subRows.length - 1; t >= 0 ; t--) {
     84                 var parent = $("#" + tableId + " tr[group='" + $(subRows[t]).attr("parent") + "']");
     85                 parent.after($(subRows[t]));
     86             }
     87         }
     88 
     89         //将列的类型转化成相应的可以排列的数据类型
     90         function convert(sValue, dataType) {
     91             switch (dataType) {
     92                 case "int":
     93                     return parseInt(sValue, 10);
     94                 case "float":
     95                     return parseFloat(sValue);
     96                 case "date":
     97                     return new Date(Date.parse(sValue));
     98                 case "string":
     99                 default:
    100                     return sValue.toString();
    101             }
    102         }
    103 
    104         //排序函数,iCol表示列索引,dataType表示该列的数据类型
    105         function compareEle(iCol, dataType) {
    106             return function (oTR1, oTR2) {
    107 
    108                 var vValue1 = convert(removeHtmlTag($(oTR1.cells[iCol]).html()), dataType);
    109                 var vValue2 = convert(removeHtmlTag($(oTR2.cells[iCol]).html()), dataType);
    110                 if (vValue1 < vValue2) {
    111                     return -1;
    112                 }
    113                 else {
    114                     return 1;
    115                 }
    116 
    117             };
    118         }
    119 
    120         //去掉html标签
    121         function removeHtmlTag(html) {
    122             return html.replace(/<[^>]+>/g, "");
    123         }
    124 
    125 
    126         //jQuery加载完以后,分组行高亮背景,分组明细隐藏
    127         $(document).ready(function () {
    128             $("tr[group]").css("background-color", "#ff9");
    129             $("tr[parent]").hide();
    130         });
    131 
    132 
    133         //点击分组行时,切换分组明细的显示/隐藏
    134         function showSub(a) {
    135             var groupValue = $(a).parent().parent().attr("group");
    136             var subDetails = $("tr[parent='" + groupValue + "']");
    137             subDetails.toggle();
    138         }
    139 
    140 
    141     </script>
    142 </head>
    143 
    144 <body>
    145 
    146     <table id="tableId" class="tbl-list" cellpadding="0" cellspacing="0">
    147         <thead>
    148             <tr>
    149                 <th>序号</th>
    150                 <th onclick="sortAble(this,'tableId', 1,'string')"
    151                     style="cursor:pointer">姓名</th>
    152                 <th onclick="sortAble(this,'tableId', 2, 'date')"
    153                     style="cursor:pointer">生日</th>
    154                 <th onclick="sortAble(this,'tableId', 3, 'int')"
    155                     style="cursor:pointer">年龄</th>
    156                 <th onclick="sortAble(this,'tableId', 4, 'float')"
    157                     style="cursor:pointer">工资</th>
    158             </tr>
    159         </thead>
    160         <tbody>
    161             <tr group="A">
    162                 <td>1</td>
    163                 <td><a href="#" onclick="showSub(this)">Group-A</a></td>
    164                 <td>01/12/1982</td>
    165                 <td>25</td>
    166                 <td>1000.50</td>
    167             </tr>
    168             <tr parent="A">
    169                 <td>2</td>
    170                 <td>A-01</td>
    171                 <td>01/09/1982</td>
    172                 <td>25</td>
    173                 <td>2000.10</td>
    174             </tr>
    175             <tr parent="A">
    176                 <td>3</td>
    177                 <td>A-02</td>
    178                 <td>01/10/1982</td>
    179                 <td>26</td>
    180                 <td>2000.20</td>
    181             </tr>
    182             <tr group="B">
    183                 <td>4</td>
    184                 <td><a href="#" onclick="showSub(this)">Group-B</a></td>
    185                 <td>10/14/1999</td>
    186                 <td>18</td>
    187                 <td>1000.20</td>
    188             </tr>
    189             <tr parent="B">
    190                 <td>5</td>
    191                 <td>B-01</td>
    192                 <td>02/12/1982</td>
    193                 <td>19</td>
    194                 <td>3000.20</td>
    195             </tr>
    196             <tr parent="B">
    197                 <td>6</td>
    198                 <td>B-02</td>
    199                 <td>03/12/1982</td>
    200                 <td>20</td>
    201                 <td>3000.30</td>
    202             </tr>
    203             <tr group="C">
    204                 <td>7</td>
    205                 <td><a href="#" onclick="showSub(this)">Group-C</a></td>
    206                 <td>10/14/1980</td>
    207                 <td>8</td>
    208                 <td>1000.30</td>
    209             </tr>
    210             <tr parent="C">
    211                 <td>8</td>
    212                 <td>C-01</td>
    213                 <td>03/12/1981</td>
    214                 <td>17</td>
    215                 <td>3100.30</td>
    216             </tr>
    217         </tbody>
    218     </table>
    219 </body>
    220 </html>
  • 相关阅读:
    css 图片的无缝滚动
    有时间研究下这个
    js的类数组对象
    js的this什么时候会出现报错
    js前端分页
    js队列
    js前端处理url中的参数为对象
    随机看的一点代码
    js的callee和caller方法
    js的Object和Function
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/3904895.html
Copyright © 2011-2022 走看看