读书人

js 兑现 table 行排序

发布时间: 2012-08-28 12:37:01 作者: rapoo

js 实现 table 行排序
js 实现 table 行排序
闲时无聊,参考网上一些资料,写了一个 SortTableTool.js 实现table行排序.
关键代码如下:

/** object *  example : sortTableT.sort('sortTable',0,'Number') *  **/var sortTableT = new SortTableTool();/** function *  SortTableTool */function SortTableTool(){/** is sort all tBodies */this.isSortAlltBodies = false;    /** is first descending sort by sortColumn */this.first_descending = false;};/** SortTableTool.sort *  tableId        : table.id *  sortColumn : cell's index of row *  nodeType    :  {'Number' ,'String' ,'Date' ,'NoCaseString'} */SortTableTool.prototype.sort = function(tableId, sortColumn ,nodeType ,_first_descending) {    var table = document.getElementById(tableId);    var _tBodies_length = this.isSortAlltBodies ? table.tBodies.length : 1;        var rowArray = new Array();    var rowIndex = 0;    for(var t=0 ; t< _tBodies_length ; t++){var tableBody = table.tBodies[t];var tableRows = tableBody.rows;for (var i = 0; i < tableRows.length; i++) {        rowArray[rowIndex++] = tableRows[i];    }}if( !isNULL(_first_descending) && ( _first_descending == true || _first_descending == false)){this.first_descending = _first_descending;}else{this.first_descending = false;}    if (table.sortColumn == sortColumn) {         rowArray.reverse();    } else {        rowArray.sort(generateCompareTR(sortColumn, nodeType));if(this.first_descending){rowArray.reverse();}    } var tbodyFragment = document.createDocumentFragment();    for (var i = 0; i < rowArray.length; i++) {        tbodyFragment.appendChild(rowArray[i]);    }    tableBody.appendChild(tbodyFragment);    table.sortColumn = sortColumn;} /** * generateCompareTR * @return  */var generateCompareTR = function(sortColumn, nodeType) {    return function compareTR(trLeft, trRight) {    var left_firstChild = trLeft.cells[sortColumn].firstChild;    var right_firstChild = trRight.cells[sortColumn].firstChild;        var leftValue = convertData(left_firstChild == null ? "" :left_firstChild.nodeValue, nodeType);        var rightValue = convertData(right_firstChild == null ? "" :right_firstChild.nodeValue, nodeType);        if (leftValue < rightValue) {            return -1;        }else if (leftValue > rightValue) {        return 1;        }else{        return 0;        }    };} /**function : convertData *  _value     : string value *  _dataType : {'Number' ,'String' ,'Date' ,'NoCaseString'} * @return */var convertData = function(_value, _dataType) {var value = isNULL(_value) ? "" :  _value;var dataType = isNULL(_dataType) ? null : _dataType.toLowerCase();var v_result = null;    switch (dataType) {      case "number":      v_result = new Number(value.trim().replace(/,/g,''));      return isNaN(v_result) ? null : v_result ;       case "string":      return value.toString();  case "nocasestring":      return value.toString().toLowerCase();      case "date":      v_result = new Date(Date.parse(value.trim().trimNBSP().replace(/-/g,'/')));      return isNaN(v_result) ? null : v_result;      default:      return value.toString();    }  }/** * isNULL() * @return true or false */var isNULL=function(v){    return v == null || typeof(v) == 'undefined';}/** * String.prototype.trim() * @return */String.prototype.trim=function(){    return this.replace(/(^\s*)|(\s*$)/g, '');}String.prototype.ltrim=function(){    return this.replace(/(^\s*)/g,'');}String.prototype.rtrim=function(){    return this.replace(/(\s*$)/g,'');}/** * String.prototype.trimNBSP() * @return */String.prototype.trimNBSP=function(){    return this.replace(/^[\s\u3000\xA0]+|[\s\u3000\xA0]+$/g, '');}String.prototype.ltrimNBSP=function(){    return this.replace(/^[\s\u3000\xA0]+/g,'');}String.prototype.rtrimNBSP=function(){    return this.replace(/[\s\u3000\xA0]+$/g,'');}//------------------ over --------------------------


效果如下图:


测试多次,发现一个棘手的问题:
如果单元格中有   ,则 trim() 无法去除  (双字节空格).
尝试多次,终于找到解决办法.新加 trimNBSP() 方法可以去除  (双字节空格).

最后,附上源码.
源码中有 2 个demo示例页.
1 楼 lily200825 2011-12-08 没人给点反应.
都爱潜水.
路过的,有想法的,留下跑路话. 2 楼 jingzhoucc 2011-12-09 下载看了 ,赞一个 3 楼 lily200825 2011-12-09 jingzhoucc 写道下载看了 ,赞一个
感谢 jingzhoucc 的评论.
总算有人认可我的辛苦劳动了.

读书人网 >JavaScript

热点推荐