`
lily200825
  • 浏览: 46577 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

js 实现 table 行排序

    博客分类:
  • js
阅读更多
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 --------------------------


效果如下图:


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

最后,附上源码.
源码中有 2 个demo示例页.
  • 描述: table排序效果图
  • 大小: 17.8 KB
分享到:
评论
8 楼 naomibyron 2014-12-25  
大神,受我一拜,我的表格各种数据类型都有,用'sortTable',2,'Number',效果很好
7 楼 love_jun1314 2014-01-24  
请问楼主 如果第一列只显示input的value 不显示外面的值 直接按input的value进行排序  就会出问题 不知能否解决
6 楼 LinApex 2013-09-22  
刚好需要这个,可以跟 myPagination 结合起来。
5 楼 guokaiyouyou 2013-05-31  
对于汉字比较大小的判断是js是按什么规则比较的?
4 楼 cava_chen 2013-05-31  
还是挺不错的。可不不能进行数字的排序
3 楼 lily200825 2011-12-09  
jingzhoucc 写道
下载看了 ,赞一个

感谢 jingzhoucc 的评论.
总算有人认可我的辛苦劳动了.
2 楼 jingzhoucc 2011-12-09  
下载看了 ,赞一个
1 楼 lily200825 2011-12-08  
没人给点反应.
都爱潜水.
路过的,有想法的,留下跑路话.

相关推荐

    js 实现 table 行排序 TableOrder.rar

    本资源“js 实现 table 行排序 TableOrder.rar”提供了一个实用的方法来实现这个功能。以下是对该实现的详细说明: 1. **HTML表格结构**: 在HTML中,`&lt;table&gt;`元素用于创建表格,`&lt;tr&gt;`表示表格行,`&lt;th&gt;`表示...

    豪华版js实现table动态排序

    7. **排序实现**:在排序函数中,根据用户点击的表头,确定排序依据(升序或降序)。然后,对数据数组进行排序,并同步更新表格的DOM结构,保持数据与视图的一致性。 8. **性能优化**:对于大量数据,直接操作DOM会...

    js对Table排序经典

    在JavaScript(js)中,对HTML表格(Table)进行排序是一项常见的需求,特别是在网页交互和数据展示中。...在提供的"js对table的完整排序"文件中,应该包含了完整的实现代码,供学习者参考和实践。

    原生js table表格自动排序效果

    在JavaScript的世界里,实现表格(table)数据的自动排序是一项常见的需求。这通常涉及到对HTML DOM的操作以及数据处理。在给定的资源中,“原生js table表格自动排序效果”提供了一个无需依赖任何外部库(如jQuery...

    table表头点击可实现排序

    在网页开发中,数据展示通常会使用表格(Table)元素,而为了使用户能更方便地浏览和理解数据,我们常常需要实现表头点击时自动排序的功能。这个功能的实现主要依赖于JavaScript,因为它提供了对DOM操作和事件监听的...

    js实现点击table表头字段带箭头标示

    综上所述,实现“点击table表头字段带箭头标示”的功能涉及到了JavaScript事件处理、DOM操作、数组排序以及UI交互设计。这不仅是提高用户体验的重要手段,也是前端开发者必备的技能之一。通过不断实践和学习,我们...

    实现table表格可按行拖拽,按列排序,并可以保存排序后的结果

    "实现table表格可按行拖拽,按列排序,并可以保存排序后的结果"是一个常见的需求,尤其适用于数据展示和管理的场景。这里我们将详细探讨如何利用jQuery、jQuery.tablesorter和jQuery.tablednd_0_5这三个JavaScript库...

    sort.js实现table表单点击列名排序

    table列点击排序功能JS实现,表单table显示的时候,点击表单列名实现升序以及降序功能!

    js代码操作table排序功能

    本文将深入探讨如何使用JavaScript实现表格数据的排序功能。 首先,我们要理解HTML表格的基本结构,它由`&lt;table&gt;`、`&lt;tr&gt;`(行)、`&lt;th&gt;`(表头)和`&lt;td&gt;`(单元格)组成。排序功能通常针对`&lt;th&gt;`元素,因为它们...

    JS动态添加、删除Table行排序(删除整行、删除整列)

    这篇教程将专注于如何使用JavaScript动态地添加、删除Table的行,并实现排序功能,包括删除整行和整列。以下是对这些概念的详细解释: 1. **动态添加Table行:** 要动态添加行,我们可以使用`document....

    javascript table 增加删除行,巧妙实现

    在JavaScript中,表格(Table)是网页数据展示的常用元素,而动态地增加或删除行则是常见的交互需求。本文将深入探讨如何巧妙地利用JavaScript来实现这个功能。 首先,我们需要了解HTML中的`&lt;table&gt;`元素及其相关...

    js-table-sorter(纯js实现点击表头排序)

    《js-table-sorter:纯JavaScript实现的表格头排序解析》 在Web开发中,数据的展示和处理是一项常见的任务,而表格(Table)是数据展示的常见方式之一。当表格中的数据量较大或者需要频繁更新时,用户通常期望能够...

    JavaScript html js Table排序

    程序的实现的是在客户端对表格进行排序,有以下特点: 1.自定义排序列、排序属性(例如innerHTML)、排序数据类型(包括int、float、date、string)、排序顺序(顺序和倒序); 2.自定义排序函数; 3.可同时设置...

    js 对页面table数据排序

    在网页开发中,JavaScript(简称JS)是一种必不可少的脚本语言,它被广泛用于实现页面交互和动态功能。本文将详细讲解如何使用JS对页面上的HTML表格数据进行排序,以便用户点击表头时能直接触发排序操作。 首先,...

    原生JS实现HTML- TABLE 自动行合并插件

    开发者提供已排序的数据列表以及需要合并行的列名即可,无需后端二次处理数据。 该类以纯原生JS编写,无需引入任何第三方库。 调用方法:new MergeRow(['col1','col2','col3'],data).renderTbl('td001'); 详情...

    js Table 选中行排序 多列锁定(多个OrderBy)

    "js Table 选中行排序 多列锁定(多个OrderBy)"这个主题就是关于如何实现这样的功能。 首先,我们来详细讲解如何实现表格的排序功能。在JavaScript中,我们可以利用HTML的`&lt;table&gt;`元素和`&lt;tr&gt;`(表格行)元素来...

    Vue3+element-plus-table-dragable(Sortable.js)实现表格拖动排序

    原创亲测至少节约小白两天时间,本人前端小白搞了好几天才实现表格拖动排序。在网上找的(vue3+sortable.js根本跑不起来)网上好多例子在vue3下根据跑不起来于是,也没有对表格排序的例子。Vuedraggable 是基于并...

    bootstrap-table.css 表格拖拽排序

    在本主题中,我们关注的是"bootstrap-table.css 表格拖拽排序",这是一种允许用户通过鼠标拖放操作来改变表格行顺序的功能。这个特性尤其适用于那些需要频繁调整数据顺序的场景,比如任务管理或者项目进度跟踪。 ...

Global site tag (gtag.js) - Google Analytics