免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1909 | 回复: 1
打印 上一主题 下一主题

js 实现 table 行排序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-08 19:48 |只看该作者 |倒序浏览
js 实现 table 行排序












闲时无聊,参考网上一些资料,写了一个 SortTableTool.js 实现table行排序.
关键代码如下:
Java代码
  1. /** object  
  2. *  example : sortTableT.sort('theTable',0,'int')  
  3. *   
  4. **/  
  5. var sortTableT = new SortTableTool();   
  6. /** function  
  7. *  SortTableTool  
  8. */  
  9. function SortTableTool(){   
  10.     /** is sort all tBodies */  
  11.     this.isSortAlltBodies = false;   
  12. };   
  13. /** SortTableTool.sort  
  14. *  tableId : table.id  
  15. *  sortColumn : cell'index of row  
  16. *  nodeType : cell data type  
  17. */  
  18. SortTableTool.prototype.sort = function(tableId, sortColumn ,nodeType) {   
  19.     var table = document.getElementById(tableId);   
  20.     var _tbody_length = this.isSortAlltBodies ? table.tBodies.length : 1;   
  21.       
  22.     var rowArray = new Array();   
  23.     var rowIndex = 0;   
  24.     for(var t=0 ; t< _tbody_length ; t++){   
  25.         var tableBody = table.tBodies[t];   
  26.         var tableRows = tableBody.rows;   
  27.         for (var i = 0; i < tableRows.length; i++) {   
  28.             rowArray[rowIndex++] = tableRows[i];   
  29.         }   
  30.     }   
  31.     if (table.sortColumn == sortColumn) {   
  32.         rowArray.reverse();   
  33.     } else {   
  34.         rowArray.sort(generateCompareTR(sortColumn, nodeType));   
  35.     }     
  36.     var tbodyFragment = document.createDocumentFragment();   
  37.     for (var i = 0; i < rowArray.length; i++) {   
  38.         tbodyFragment.appendChild(rowArray[i]);   
  39.     }   
  40.     tableBody.appendChild(tbodyFragment);   
  41.     table.sortColumn = sortColumn;   
  42. }   
  43. var generateCompareTR = function(sortColumn, nodeType) {   
  44.     return function compareTR(trLeft, trRight) {   
  45.         var left_firstChild = trLeft.cells[sortColumn].firstChild;   
  46.         var right_firstChild = trRight.cells[sortColumn].firstChild;   
  47.         var leftValue = this.convertData(left_firstChild == null ? "" :left_firstChild.nodeValue, nodeType);   
  48.         var rightValue = this.convertData(right_firstChild == null ? "" :right_firstChild.nodeValue, nodeType);   
  49.         if (leftValue < rightValue) {   
  50.             return -1;   
  51.         }else if (leftValue > rightValue) {   
  52.             return 1;   
  53.         }else{   
  54.             return 0;   
  55.         }   
  56.     };   
  57. }   
  58. var convertData = function(_value, dataType) {   
  59.     var value = (_value == null ) ? "" :  _value;   
  60.     var v_result = null;   
  61.     switch (dataType) {   
  62.       case "int":   
  63.           v_result = parseInt(value.trim().replace(/,/g,''));   
  64.           return isNaN(v_result) ? null : v_result ;   
  65.       case "float":   
  66.           v_result = parseFloat(value.trim().replace(/,/g,''));   
  67.           return isNaN(v_result) ? null : v_result;   
  68.       case "string":   
  69.           return value.toString().ltrim();   
  70.       case "date":   
  71.           v_result = new Date(Date.parse(value.trim().replace(/-/g,'/')));   
  72.           return isNaN(v_result) ? null : v_result;   
  73.       default:   
  74.           return value.toString();   
  75.     }     
  76. }   
  77. /**  
  78. * String.prototype.trim  
  79. * @return  
  80. */  
  81. String.prototype.trim=function(){   
  82.     return this.replace(/(^\s*)|(\s*$)/g, '');   
  83. }   
  84. String.prototype.ltrim=function(){   
  85.     return this.replace(/(^\s*)/g,"");   
  86. }   
  87. String.prototype.rtrim=function(){   
  88.     return this.replace(/(\s*$)/g,"");   
  89. }   
  90. //------------------ over --------------------------  

  91. /** object
  92. *  example : sortTableT.sort('theTable',0,'int')
  93. *
  94. **/
  95. var sortTableT = new SortTableTool();
  96. /** function
  97. *  SortTableTool
  98. */
  99. function SortTableTool(){
  100.         /** is sort all tBodies */
  101.         this.isSortAlltBodies = false;
  102. };
  103. /** SortTableTool.sort
  104. *  tableId : table.id
  105. *  sortColumn : cell'index of row
  106. *  nodeType : cell data type
  107. */
  108. SortTableTool.prototype.sort = function(tableId, sortColumn ,nodeType) {
  109.     var table = document.getElementById(tableId);
  110.     var _tbody_length = this.isSortAlltBodies ? table.tBodies.length : 1;
  111.    
  112.     var rowArray = new Array();
  113.     var rowIndex = 0;
  114.     for(var t=0 ; t< _tbody_length ; t++){
  115.                 var tableBody = table.tBodies[t];
  116.                 var tableRows = tableBody.rows;
  117.                 for (var i = 0; i < tableRows.length; i++) {
  118.                 rowArray[rowIndex++] = tableRows[i];
  119.             }
  120.         }
  121.     if (table.sortColumn == sortColumn) {
  122.         rowArray.reverse();
  123.     } else {
  124.         rowArray.sort(generateCompareTR(sortColumn, nodeType));
  125.     }  
  126.     var tbodyFragment = document.createDocumentFragment();
  127.     for (var i = 0; i < rowArray.length; i++) {
  128.         tbodyFragment.appendChild(rowArray[i]);
  129.     }
  130.     tableBody.appendChild(tbodyFragment);
  131.     table.sortColumn = sortColumn;
  132. }
  133. var generateCompareTR = function(sortColumn, nodeType) {
  134.     return function compareTR(trLeft, trRight) {
  135.             var left_firstChild = trLeft.cells[sortColumn].firstChild;
  136.             var right_firstChild = trRight.cells[sortColumn].firstChild;
  137.         var leftValue = this.convertData(left_firstChild == null ? "" :left_firstChild.nodeValue, nodeType);
  138.         var rightValue = this.convertData(right_firstChild == null ? "" :right_firstChild.nodeValue, nodeType);
  139.         if (leftValue < rightValue) {
  140.             return -1;
  141.         }else if (leftValue > rightValue) {
  142.                 return 1;
  143.         }else{
  144.                 return 0;
  145.         }
  146.     };
  147. }
  148. var convertData = function(_value, dataType) {
  149.         var value = (_value == null ) ? "" :  _value;
  150.         var v_result = null;
  151.     switch (dataType) {
  152.       case "int":
  153.               v_result = parseInt(value.trim().replace(/,/g,''));
  154.               return isNaN(v_result) ? null : v_result ;
  155.       case "float":
  156.               v_result = parseFloat(value.trim().replace(/,/g,''));
  157.               return isNaN(v_result) ? null : v_result;
  158.       case "string":
  159.               return value.toString().ltrim();
  160.       case "date":
  161.               v_result = new Date(Date.parse(value.trim().replace(/-/g,'/')));
  162.               return isNaN(v_result) ? null : v_result;
  163.       default:
  164.               return value.toString();
  165.     }  
  166. }
  167. /**
  168. * String.prototype.trim
  169. * @return
  170. */
  171. String.prototype.trim=function(){
  172.     return this.replace(/(^\s*)|(\s*$)/g, '');
  173. }
  174. String.prototype.ltrim=function(){
  175.     return this.replace(/(^\s*)/g,"");
  176. }
  177. String.prototype.rtrim=function(){
  178.     return this.replace(/(\s*$)/g,"");
  179. }
  180. //------------------ over --------------------------
复制代码
效果如下图:


测试多次,发现一个棘手的问题:
如果单元格中有 &nbsp; ,则 convertData 中无法去除 &nbsp;
各位大家,有什么好的方法和建议,可留言我.

论坛徽章:
0
2 [报告]
发表于 2011-12-24 20:40 |只看该作者
谢谢分享  希望于楼主多多交流
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP