分享一个自己写的table表格排序js插件(高效简洁)


Posted in Javascript onOctober 29, 2011

像:jQuery的table排序插件(感觉其使用比较麻烦或不清楚其具体用法,就没有使用)、原生态js的table排序插件等,最后比较看了下——采用了一个原生态js的table排序插件,并在其基础上做了些修改,虽有些勉强或有些地方使用不太舒服,但最算是比较好的实现了当时需要的功能。而前两天,对原有表格做了点儿修改——增加隔行换色的功能,问题就出现了,——效果错乱;检查分析了下,问题出在其table排序插件代码上——其原代码写的比较难理解,修改还不如重新自己写一个table排序插件。

说写就写,table排序其实很简单:就是取出所有排序列的值并存放在数组中(并且各列对应行对象也存放到一个数组中),然后对排序列的值数组排序(并对行对象数组排序)。下面贴出table排序插件代码:

/** 
* @description 表格排序实现 
* @author Blog:http://www.cnblogs.com/know/ 
* @date 2011-10-28 
**/ 
(function () { 
//初始化配置对象 
var _initConfig = null; 
var _tableObj = null, _tbodyObj = null, _tBodyIndex = 0; 
//存放当前各排序方式下的(有序)行数组的对象——仅在IsLazyMode=true,此变量有用 
var _trJqObjArray_Obj = null; 
/** 
* 添加排序方式(规则)的方法 
* @private 
* @param trJqObjArr:(外部传入)存放排序行的数组,tdIndex:排序列的索引,td_valAttr:排序列的取值属性,td_dataType:排序列的值类型 
**/ 
function _GetOrderTdValueArray(trJqObjArr, tdIndex, td_valAttr, td_dataType) { 
var tdOrderValArr = new Array(); 
var trObj, tdObj, tdVal; 
_tbodyObj.find("tr").each(function (i, trItem) { 
trObj = $(trItem); 
trJqObjArr.push(trObj); 
tdObj = trObj.find("td")[tdIndex]; 
tdObj = $(tdObj); 
tdVal = td_valAttr ? tdObj.attr(td_valAttr) : tdObj.text(); 
tdVal = _GetValue(tdVal, td_dataType); 
tdOrderValArr.push(tdVal); 
}); 
return tdOrderValArr; 
} 
/** 
* 返回jQuery对象的方法 
* @private 
**/ 
function _GetJqObjById(id) { 
return "string" == typeof (id) ? $("#" + id) : $(id); 
}; 
/** 
* 排序方法 
* @private 
* @param tdIndex:排序列的索引,options:排序列的规则配置对象 
**/ 
function _Sort(tdIndex, options) { 
var trJqObjArr = null; 
if (_initConfig.IsLazyMode) { 
!_trJqObjArray_Obj && (_trJqObjArray_Obj = {}); 
trJqObjArr = _trJqObjArray_Obj[tdIndex]; 
} 
var isExist_trJqObjArr = true; 
if (!trJqObjArr) { 
isExist_trJqObjArr = false; 
trJqObjArr = new Array(); 
var tdOrderValArr = _GetOrderTdValueArray(trJqObjArr, tdIndex, options.ValAttr, options.DataType); 
var sort_len = tdOrderValArr.length - 1; 
var isExchanged = false, compareOper = options.Desc ? ">" : "<"; 
for (var i = 0; i < sort_len; i++) { 
isExchanged = false; 
for (var j = sort_len; j > i; j--) { 
if (eval(tdOrderValArr[j] + compareOper + tdOrderValArr[j - 1])) { 
_ExchangeArray(tdOrderValArr, j); 
//交换行对象在数组中的顺序 
_ExchangeArray(trJqObjArr, j); 
isExchanged = true; 
} 
} 
//一遍比较过后如果没有进行交换则退出循环 
if (!isExchanged) 
break; 
} 
_initConfig.IsLazyMode && (_trJqObjArray_Obj[tdIndex] = trJqObjArr); 
} 
if (trJqObjArr) { 
if (options.Toggle) { 
_initConfig.IsLazyMode && isExist_trJqObjArr && trJqObjArr.reverse(); 
options.Desc = !options.Desc; 
} 
_ShowTable(trJqObjArr); 
} 
} 
/** 
* 显示排序后的表格 
* @private 
* @param trJqObjArr:排序后的tr对象数组 
**/ 
function _ShowTable(trJqObjArr) { 
_tbodyObj.html(""); 
for (var n = 0, len = trJqObjArr.length; n < len; n++) { 
_tbodyObj.append(trJqObjArr[n]); 
$.isFunction(_initConfig.OnShow) && (_initConfig.OnShow(n, trJqObjArr[n], _tbodyObj)); 
} 
} 
/** 
* 交换数组中项的方法 
* @private 
* @param array:数组,j:交换数组项的尾项索引 
**/ 
function _ExchangeArray(array, j) { 
var temp = array[j]; 
array[j] = array[j - 1]; 
array[j - 1] = temp; 
} 
/** 
* 添加排序方式(规则)的方法 
* @private 
* @param tdVal:排序列的值,td_dataType:排序列的值类型 
**/ 
function _GetValue(tdVal, td_dataType) { 
switch (td_dataType) { 
case "int": 
return parseInt(tdVal) || 0; 
case "float": 
return parseFloat(tdVal) || 0; 
case "date": 
return Date.parse(tdVal) || 0; 
case "string": 
default: 
return tdVal.toString() || ""; 
} 
} 
/** 
* 添加排序方式(规则)的方法 
* @private 
* @param obj:排序触发(标签)的对象或id,index:要排序列所在的列索引,options:排序规则设置对象(如:DataType...) 
**/ 
function _SetOrder(obj, index, options) { 
var orderSettings = { 
ValAttr: false, //排序列的取值属性,默认为:innerText 
DataType: "string", //排序列的值类型(可取值:int|float|date|string) 
OnClick: null, //(点击)排序时触发的方法 
Desc: true, //(是否是降序)排序方式,默认为:降序 
Toggle: true, //切换排序方式 
DefaultOrder: false //是否是默认的排序方式 
}; 
$.extend(orderSettings, options); 
orderSettings.DataType = orderSettings.DataType.toLowerCase(); 
obj = _GetJqObjById(obj); 
//绑定触发排序的事件 
obj.bind("click", function () { 
_Sort(index, orderSettings); 
$.isFunction(orderSettings.OnClick) && orderSettings.OnClick(); 
}); 
orderSettings.DefaultOrder && _Sort(index, orderSettings); 
} 
var _api = { 
Init: function (obj, tBodyIndex, options) { 
if (obj == null || typeof (obj) == undefined) { 
alert("TableOrder初始化参数为空或有误!"); 
return; 
} 
_tableObj = _GetJqObjById(obj); 
_tBodyIndex = tBodyIndex || 0; 
_tbodyObj = _tableObj.find("tbody:eq(" + _tBodyIndex + ")"); 
options = options || {}; 
_initConfig = { 
IsLazyMode: true, //是否是懒惰模式,默认为:true 
OnShow: null //排序后表格显示时的方法,params:trIndex,trJqObj,tbodyObj 
}; 
$.extend(_initConfig, options); 
_trJqObjArray_Obj = null; 
}, 
SetOrder: function (obj, index, options) { 
if (_tableObj == null) { 
alert("_tableObj尚未初始化!"); 
return; 
} 
_SetOrder(obj, index, options); 
} 
}; 
window.TableOrderOper = _api; 
})();

其使用如下:
<table border="0" cellspacing="0" cellpadding="0" class="fu_list" id="idTable"> 
<thead> 
<tr> 
<td> <a href="javascript:void(0)" id="idTitle">名称</a> / <a href="javascript:void(0)" id="idExt">类型</a></td> 
<td width="150" align="center"><a href="javascript:void(0)" id="idAddtime" class="up">上传时间</a></td> 
<td width="50" align="center"><a href="javascript:void(0)" id="idSize">大小</a></td> 
</tr> 
</thead> 
<tbody> 
<tr class="hoverTr"> 
<td _ext="rar">JSCSS</td> 
<td align="center" _order="2008/9/12 8:51:09">2008/9/12 8:51:09</td> 
<td align="right" _order="433247">433247</td> 
</tr> 
<tr> 
<td _ext="htm">AJAX</td> 
<td align="center" _order="2008/3/6 20:12:23">2008/3/6 20:12:23</td> 
<td align="right" _order="11394">11394</td> 
</tr> 
<tr> 
<td _ext="htm">EXT</td> 
<td align="center" _order="2008/10/4 20:21:54">2008/10/4 20:21:54</td> 
<td align="right" _order="351">351</td> 
</tr> 
<tr> 
<td _ext="xml">Index</td> 
<td align="center" _order="2008/10/4 20:24:11">2008/10/4 20:24:11</td> 
<td align="right" _order="14074">14074</td> 
</tr> 
<tr> 
<td _ext="js">ORDER</td> 
<td align="center" _order="2008/10/4 20:24:11">2008/10/4 20:24:11</td> 
<td align="right" _order="2844">2844</td> 
</tr> 
</tbody> 
</table> 
<script src="../Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> 
<script src="TableOrder.js" type="text/javascript"></script> 
<script type="text/javascript"> 
TableOrderOper.Init("idTable", 0, { 
OnShow: function (i, trJqObj, _tbodyObj) { 
trJqObj.attr("class", ((i +1) %2==0?"hoverTr" : "")); 
} 
}); 
TableOrderOper.SetOrder("idAddtime", 1, { ValAttr: "_order", DataType: "date" }); 
TableOrderOper.SetOrder("idSize", 2, { DataType: "int", DefaultOrder: true, OnClick: function () { 
alert("idSize"); 
} }); 
</script>

代码中注释我都尽量写的比较清楚了,需要补充说明的是:

1.js使用的是闭包,我强调代码要尽可能的简洁易懂。

2.IsLazyMode属性设置,IsLazyMode=true,适用于当前要排序的表格是不变的,即不会有ajax的增删改行的操作,而且你看代码后就可以看出的一个好处:把要排序列的对应的行对象只一次遍历,并将排序后的行对象数组保存在全局对象中,下次排序时直接通过tdIndex(排序列的索引)取出对应的行对象数组,并将数组反转,即可实现排序的效果,可以在一定程度上提高代码执行效率(性能); IsLazyMode=false, 即适用于当前要排序的表格会改变,如有ajax的增删改行的操作的情况。

3.考虑一般要排序的表格数据量都不大,其中的数组排序使用的是冒泡排序算法。

4.OnShow: null //排序后表格显示时的方法,params:trIndex,trJqObj,tbodyObj ——可方便用于设置排序后的表格的换行样式等,也出于对性能优化方面的考虑。

好了,最后,附上插件js和demo,目前的实现只能说是能很好的满足我当前项目中的需求或适用于于大多数的场景,如果有没有考虑到或不好的地方,希望各位路过的朋友,能毫不客气的拍砖留言,大家互相交流学习!

OrderTable.rar

原文地址: cnblogs know

Javascript 相关文章推荐
js CSS操作方法集合
Oct 31 Javascript
Javascript/Jquery——简单定时器的多种实现方法
Jul 03 Javascript
MyEclipse取消验证Js的两种方法
Nov 14 Javascript
基于豆瓣API+Angular开发的web App
Jan 02 Javascript
正则表达式(语法篇推荐)
Jun 24 Javascript
BootStrap table使用方法分析
Nov 08 Javascript
JS实现的简单拖拽功能示例
Mar 13 Javascript
webpack+vue中使用别名路径引用静态图片地址
Nov 20 Javascript
Vue父子组件之间的通信实例详解
Sep 28 Javascript
JS算法题之查找数字在数组中的索引位置
May 15 Javascript
npm的lock机制解析
Jun 20 Javascript
vue+spring boot实现校验码功能
May 27 Vue.js
Json2Template.js 基于jquery的插件 绑定JavaScript对象到Html模板中
Oct 29 #Javascript
基于jQuery的输入框在光标位置插入内容, 并选中
Oct 29 #Javascript
基于jquery的无限级联下拉框js插件
Oct 29 #Javascript
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
Oct 29 #Javascript
仿猪八戒网左下角的文字滚动效果
Oct 28 #Javascript
js实现双向链表互联网机顶盒实战应用实现
Oct 28 #Javascript
js常用代码段收集
Oct 28 #Javascript
You might like
php in_array 函数使用说明与in_array需要注意的地方说明
2010/04/13 PHP
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
php视频拍照上传头像功能实现代码分享
2015/10/08 PHP
PHP按一定比例压缩图片的方法
2018/10/12 PHP
PHP实现财务审核通过后返现金额到客户的功能
2019/07/04 PHP
Laravel timestamps 设置为unix时间戳的方法
2019/10/11 PHP
JS 统计时间
2021/03/09 Javascript
jQuery弹出层插件简化版代码下载
2008/10/16 Javascript
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
flash遮住div问题的正确解决方法
2014/02/27 Javascript
nodejs npm包管理的配置方法及常用命令介绍
2014/06/05 NodeJs
JavaScript中九种常用排序算法
2014/09/02 Javascript
webapp框架AngularUI的demo改造之路
2014/12/21 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
2016/01/18 Javascript
jQuery EasyUI常用数据验证汇总
2016/09/18 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
js实现固定宽高滑动轮播图效果
2017/01/13 Javascript
原生js 封装get ,post, delete 请求的实例
2017/08/11 Javascript
weex里Vuex state使用storage持久化详解
2017/09/09 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
nginx部署多个vue项目的方法示例
2020/09/06 Javascript
[01:12]DOTA2 2015年秋季互动指南
2015/11/10 DOTA
python中字典(Dictionary)用法实例详解
2015/05/30 Python
python opencv 图像尺寸变换方法
2018/04/02 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
Python实现图像去噪方式(中值去噪和均值去噪)
2019/12/18 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
2020/02/28 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
2020/03/23 Python
部署Django到阿里云服务器教程示例
2020/06/03 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
YesStyle美国/全球:购买亚洲时装、美容化妆品和生活百货
2017/01/16 全球购物
公务员职务工作的自我评价
2013/11/01 职场文书
2014年教师节演讲稿
2014/09/03 职场文书
你知道哪几种MYSQL的连接查询
2021/06/03 MySQL
Python排序算法之插入排序及其优化方案详解
2021/06/11 Python