分享一个自己写的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 相关文章推荐
javascript中的对象和数组的应用技巧
Jan 07 Javascript
javascript 继承实现方法
Aug 26 Javascript
javascript操作JSON的要领总结
Dec 09 Javascript
基于JavaScript实现 获取鼠标点击位置坐标的方法
Apr 12 Javascript
js获得参数的getParameter使用示例
Feb 26 Javascript
原生javaScript实现图片延时加载的方法
Dec 22 Javascript
Js可拖拽放大的层拖动特效实现方法
Feb 25 Javascript
jquery插件uploadify实现带进度条的文件批量上传
Dec 13 Javascript
bootstrap组件之按钮式下拉菜单小结
Jan 19 Javascript
JS去掉字符串前后空格、阻止表单提交的实现代码
Jun 08 Javascript
简单实现vue验证码60秒倒计时功能
Oct 11 Javascript
jQuery实现监听下拉框选中内容发生改变操作示例
Jul 13 jQuery
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
phpMyadmin 用户权限中英对照
2010/04/02 PHP
php远程下载类分享
2016/04/13 PHP
PHP实现QQ快速登录的方法
2016/09/28 PHP
jquery动态改变onclick属性导致失效的问题解决方法
2013/12/04 Javascript
JS冒泡事件的快速解决方法
2013/12/16 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
AnjularJS中$scope和$rootScope的区别小结
2016/09/18 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
2017/01/13 Javascript
Express URL跳转(重定向)的实现方法
2017/04/07 Javascript
前端页面文件拖拽上传模块js代码示例
2017/05/19 Javascript
js学习心得_一个简单的动画库封装tween.js
2017/07/14 Javascript
layui中table表头样式修改方法
2018/08/15 Javascript
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
javascript实现考勤日历功能
2018/11/29 Javascript
Vue动态生成el-checkbox点击无法赋值的解决方法
2019/02/21 Javascript
[01:11:21]DOTA2-DPC中国联赛 正赛 VG vs Elephant BO3 第一场 3月6日
2021/03/11 DOTA
Python 流程控制实例代码
2009/09/25 Python
Python使用dis模块把Python反编译为字节码的用法详解
2016/06/14 Python
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
pytorch打印网络结构的实例
2019/08/19 Python
python 解决flask uwsgi 获取不到全局变量的问题
2019/12/22 Python
HTML5中视频音频的使用详解
2017/07/07 HTML / CSS
html5唤起app的方法
2017/11/30 HTML / CSS
建筑实习自我鉴定
2013/10/18 职场文书
企划经理的岗位职责
2013/11/17 职场文书
《中国的气候》教学反思
2014/02/23 职场文书
社区母亲节活动记录
2014/03/06 职场文书
安全生产标语
2014/06/06 职场文书
物理学专业求职信
2014/07/04 职场文书
幼儿教师暑期培训方案
2014/08/27 职场文书
2014年社区重阳节活动策划方案
2014/09/16 职场文书
春节慰问简报
2015/07/21 职场文书
小公司融资,商业计划书的8切记
2019/07/15 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书
2019年家电促销广告语集锦
2019/10/21 职场文书