如下图:
要求:点击表头排序时,"分组"及"分组明细"的数据层次关系不变
从网上找了一段常规的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) {1 11 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>