js之排序表格
2012-11-01 18:19
288 查看
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>SortableTable</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" type="text/css" href="base.css"> <script type="text/javascript"> window.onload = function(){ var s = new SortableTable(document.getElementById('xxx')); //s.sortByCol(1,1); } /** 该表格表格头放在thead里面,所有交互操作通过表格头实现 要排序的行放在tbody里面 */ /** 就是通过表头点击事件操作所有的tbody里面的行,行的值为对应列单元格的值, 通过数组的排序实现,将排序好的列重新插入表格 */ function SortableTable(table){ this.table = table;//排序的表格 this.headers = table.tHead.rows[0].cells;//表头每个单元格,按单元格的该列排序行 this.rows = this.table.tBodies[0].rows;//要排序的行,tbody可以不止有一个所以用tbodies for(var i=0;i<this.headers.length;i++){ if(this.headers[i].className){//有className表示要按照该列排序 this.headers[i].currentOrder = 1; var _this = this; (function(i){ _this.headers[i].onclick = function(){ _this.sortByCol(i,this.currentOrder); this.currentOrder = -this.currentOrder; }; })(i); } } } SortableTable.prototype = { sortByCol:function(colIndex,des){//colIndex:按照对应的列的值排序行 //des:1表示正序,-1表示逆序,默认1 des = des || 1; var ay = []; for(var i=0;i<this.rows.length;i++){ //alert(typeof getInnerText(this.rows[i].cells[colIndex])); ay.push({ node:this.rows[i], value:getInnerText(this.rows[i].cells[colIndex]) }); } var _this = this; ay.sort(function(a,b){//array定义了sort函数会自动排序 //a,b对应着数组中的元素 //规则和java的Comparator函子一样 var fn ; switch(_this.headers[colIndex].getAttribute('valuetype')){ //对于不同类型,排序规则不一样, //在thead对应的单元格用自定义的属性valuetype区分 //这里必须用标准函数,点运算符取属性值是取不出来的 case 'number': fn = function(a,b){ var result; if(+a.value>+b.value) result = 1; else if(+a.value<+b.value) result = -1; else result = 0; return result*des; }; break; case null://默认为string fn = function(a,b){ //alert(a.value); return a.value.localeCompare(b.value)*des; } break; case 'date': fn = function(a,b,fmt){ a = dateDecode(a.value,fmt); b = dateDecode(b.value,fmt); var result; if(+a>+b) result = 1; else if(+a<+b) result = -1; else result = 0; return result*des; }; break; } return fn(a,b,_this.headers[colIndex].getAttribute('param')); }); //排序完了就插入到原始的tbody里面 var f = document.createDocumentFragment(); //var frag=document.createDocumentFragment(); for(var i=0;i<ay.length;i++){ f.appendChild(ay[i].node); } this.table.tBodies[0].appendChild(f); } } function dateDecode(s,format){ //s:日期字符串 //format:日期字符串显示格式 //返回s对应的日期对象 format = format.split(''); var nums = s.match(/\d+/g); var date = new Date(); for(var i=0;i<format.length;i++){ switch(format[i]){ case 'Y': date.setFullYear(nums[i]); break; case 'm': date.setMonth(nums[i]-1); break; case 'd': date.setDate(nums[i]); break; case 'H': date.setHours(nums[i]); break; case 'i': date.setMinutes(nums[i]); break; case 's': date.setSeconds(nums[i]); break; } } return date; } //得到某节点内部所有的文本 function getInnerText(node){ if(node.nodeType==3)//文本节点 return node.nodeValue.trim(); else if(node.nodeType==1){ var ret = ''; for(var i=0;i<node.childNodes.length;i++){ ret += getInnerText(node.childNodes[i]); } return ret; } } //字符串去除开始和最后的空白节点 String.prototype.trim = function(){ return this.replace(/^\s+/,'').replace(/\s+$/,''); }; </script> </head> <body> <h1>SortableTable</h1> <table class="sortableTable" border="1" id='xxx'> <caption>成绩表</caption> <thead> <tr> <th class="sortableCol">姓名</th> <th class="sortableCol" valuetype="number">年龄</th> <th>性别</th> <th class="sortableCol" valuetype="number">Java</th> <th class="sortableCol" valuetype="number">Python</th> <th class="sortableCol" valuetype="number">Ruby</th> <th class="sortableCol" valuetype="number">Linux Shell</th> <th class="sortableCol" valuetype="number">VB.NET</th> <th class="sortableCol" valuetype="number">总分</th> <th class="sortableCol" valuetype="date" param="Ymd">日期</th> </tr> </thead> <tbody> <tr> <td>陈董</td> <td>22</td> <td>男</td> <td>90</td> <td>65</td> <td>56</td> <td>45</td> <td>80</td> <td>336</td> <td>2009-10-10</td> </tr> <tr> <td>王艳</td> <td>26</td> <td>女</td> <td>95</td> <td>70</td> <td>56</td> <td>55</td> <td>80</td> <td>356</td> <td>2009-10-1</td> </tr> <tr> <td>吴德华</td> <td>19</td> <td>女</td> <td>60</td> <td>60</td> <td>56</td> <td>40</td> <td>60</td> <td>276</td> <td>2009-9-10</td> </tr> <tr> <td>董城</td> <td>24</td> <td>男</td> <td>80</td> <td>75</td> <td>66</td> <td>65</td> <td>80</td> <td>366</td> <td>2009-10-10</td> </tr> <tr> <td>王俊</td> <td>20</td> <td>男</td> <td>80</td> <td>75</td> <td>46</td> <td>40</td> <td>80</td> <td>321</td> <td>2009-10-16</td> </tr> <tr> <td>陈聘</td> <td>18</td> <td>男</td> <td>80</td> <td>55</td> <td>56</td> <td>40</td> <td>75</td> <td>306</td> <td>2009-8-11</td> </tr> <tr> <td>吴奇</td> <td>18</td> <td>男</td> <td>85</td> <td>65</td> <td>45</td> <td>60</td> <td>78</td> <td>323</td> <td>2009-8-10</td> </tr> </tbody> </table> </body> </html>
相关文章推荐
- js表格排序(支持int,float,date,string四种数据类型)
- js实现表格字段本地排序
- js-点击表格自动排序
- js表格拖动排序
- JS表格排序
- 利用js排序html表格
- HTML DOM(动态加载js、动态建表、表格排序)
- 一段js表格排序代码
- JavaScript高级程序设计 阅读笔记(十九) js表格排序
- 简单的js表格排序 (归总)
- JS实现HTML表格排序功能
- js表格字段排序
- JS实现计时器(prototype)+表格排序
- JS实现table表格数据排序(可支持动态数据+分页效果)
- 利用原生JS实现表格正反排序
- js实现表格排序(正序和反序)
- js 表格排序(编辑+拖拽+缩放)
- js实现表格字段排序
- 改进jquery.tablesorter.js 支持中文表格排序
- JS表格排序