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>
原文地址:https://www.cnblogs.com/yjmyzz/p/3904895.html