用Javascript进行简单的Table点击排序.

闲着没事,随便写了个简单的Table排序的js,大家有兴趣的看看,有需要的就拿去吧.废话不说了,大家看代码吧,最下面是效果,着急的就直接往下拉好了.新发现一个bug:10比2小,原因是sort默认是按ascii排序的,已修复该问题.
旧版DEMO下载
最新DEMO下载 [修复了一些已知的问题,结合网友的回复优化了一些代码,用法跟原来要样]
html代码[可以不看,跟html没什么关系.]:

javascript代码:
示例:


posted @ 2008-04-20 00:51 狼Robot Views(3536) Comments(43) Edit 收藏

 回复 引用 查看   
#1楼2008-04-20 02:02 | 镜涛      
呵呵,学习一下。
 回复 引用   
#2楼2008-04-20 07:06 | BAsil
支持一
 回复 引用 查看   
#3楼2008-04-20 09:09 | 李战      
楼主太强了!我一定要偷来用,俺才发觉咱俩目前做的很多事情都很相通啊。多谢!
 回复 引用 查看   
#4楼2008-04-20 09:26 | 高_超      
不错的demo.拿来学学。
 回复 引用 查看   
#5楼2008-04-20 09:29 | Justin      
真的是很好的Demo呀!
 回复 引用 查看   
#6楼2008-04-20 09:29 | 侯垒      
很不错呀!
 回复 引用 查看   
#7楼[楼主]2008-04-20 09:39 | 狼Robot      
@李战
不敢当了,你就不要再笑我了.我菜,我知道.
以后多点化下我,让我也能沾沾佛主的光.呵呵.

 回复 引用 查看   
#8楼2008-04-20 09:44 | JackLee      
楼主很强呀!!

 回复 引用 查看   
#9楼2008-04-20 09:46 | Benson_design....      
很酷哦!这个功能我经常会用到!谢了
 回复 引用   
#10楼2008-04-20 09:52 | sharelai[未注册用户]
很强,代码量也很少,以后用了有版权问题吗?
谢谢博主。

 回复 引用 查看   
#11楼2008-04-20 09:57 | Agan@CN      
不错,不过我发现你的排序是有问题的,如果A的年龄是9,B的年龄是89,你的升序排序结果B-A,因为只是简单的字符排序,这种情况是不适合的,要支持对数据类型的排序,就要对不同类型的数据识别,可以使用正则表达式来判断,网上现成的有很多,可以参考一下。
 回复 引用   
#12楼2008-04-20 10:04 | sharelai[未注册用户]
加入收藏夹了,希望楼主多发这些JS实用的特效,谢谢了!
期待窗口悬浮DEMO,谢谢了

 回复 引用 查看   
#13楼[楼主]2008-04-20 10:05 | 狼Robot      
@Agan@CN
早上起来发现了这个问题.现在修复了.呵呵.估计你看的时候我在上传.

 回复 引用 查看   
#14楼[楼主]2008-04-20 10:07 | 狼Robot      
@sharelai
你不是说的拖动div吧?

 回复 引用   
#15楼2008-04-20 10:10 | yfalcon[未注册用户]
还是有些问题的,另外,支不支持翻页排序?
 回复 引用 查看   
#16楼[楼主]2008-04-20 10:25 | 狼Robot      
@yfalcon
看代码就知道了,这个只是针对一个现有的table排序的,如果要翻页排序就不是这样写的.

 回复 引用   
#17楼2008-04-20 10:30 | sharelai[未注册用户]
不是拖动
是那种可以最大化窗口,也可以小化缩到右下角。

 回复 引用 查看   
#18楼[楼主]2008-04-20 10:37 | 狼Robot      
@sharelai
你的意思是在web里仿windows的窗口?可以拖动,最大化最不化?
按理来说应该不难,等我下次闲的时候试试看能不能写出来.

 回复 引用 查看   
#19楼2008-04-20 11:15 | Agan@CN      
日期型的你还是没有处理
 回复 引用 查看   
#20楼[楼主]2008-04-20 12:24 | 狼Robot      
@Agan@CN
开始发现了,改过了的.结果不知道搞来搞去又搞不见了.
原因是IsNumeric方法的正则少了两个字符[^$].

 回复 引用 查看   
#21楼2008-04-20 14:09 | Ants      
--引用--------------------------------------------------
狼Robot: @Agan@CN
开始发现了,改过了的.结果不知道搞来搞去又搞不见了.
原因是IsNumeric方法的正则少了两个字符[^$].
--------------------------------------------------------

 回复 引用 查看   
#22楼[楼主]2008-04-20 14:35 | 狼Robot      
@Ants
还是有问题,IsNumeric中的[]应该换成()才对,郁闷,想放个demo看来还是有点麻烦,改了blog上的忘了改本机的,改了本机的又覆盖了blog的.

 回复 引用   
#23楼2008-04-20 17:32 | ivanyb[未注册用户]
好东西,很有用处.省了我不少时间.感谢搂主
 回复 引用 查看   
#24楼2008-04-20 18:03 | 留恋星空      
很好,很强大。多谢。偶收下了
 回复 引用 查看   
#25楼2008-04-20 19:50 | 王孟军!      
很好
 回复 引用   
#26楼2008-04-20 19:57 | xiaoming[未注册用户]
我也弄了一个

<table style="border:solid 1px #DDDDDD;" frame='border' rules='all' cellpadding="0" cellspacing="0" id="tbsort">
<thead>
<tr>
<th>序号</th>
<th>姓名</th>
<th>工号</th>
<th>职位</th>
<th>性别</th>
<th>业绩</th>
<th>报到时间</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>刘德华</td>
<td>8008</td>
<td>总裁</td>
<td>男</td>
<td>98</td>
<td>2008-04-12</td>
</tr>
<tr>
<td>2</td>
<td>吴奇隆</td>
<td>8004</td>
<td>主管</td>
<td>男</td>
<td>80</td>
<td>2008-04-16</td>
</tr>
<tr>
<td>3</td>
<td>王光良</td>
<td>8003</td>
<td>经理</td>
<td>男</td>
<td>85</td>
<td>2008-04-15</td>
</tr>
<tr>
<td>4</td>
<td>张学友</td>
<td>8009</td>
<td>副总裁</td>
<td>男</td>
<td>9</td>
<td>2008-04-11</td>
</tr>
<tr>
<td>5</td>
<td>张柏芝</td>
<td>8005</td>
<td>助理</td>
<td>女</td>
<td>78</td>
<td>2008-04-13</td>
</tr>
<tr>
<td>6</td>
<td>***</td>
<td>8001</td>
<td>总监</td>
<td>男</td>
<td>60</td>
<td>2008-04-18</td>
</tr>
<tr>
<td>7</td>
<td>陈慧琳</td>
<td>8002</td>
<td>试用期</td>
<td>女</td>
<td>85</td>
<td>2008-04-18</td>
</tr>
<tr>
<td>8</td>
<td>张曼玉</td>
<td>8007</td>
<td>高级经理</td>
<td>女</td>
<td>82</td>
<td>2008-04-16</td>
</tr>
<tr>
<td>9</td>
<td>周润发</td>
<td>8006</td>
<td>副总裁</td>
<td>男</td>
<td>88</td>
<td>2008-04-13</td>
</tr>
</tbody>
</table>
<script type='text/javascript'>
window.$id = function(id) {
return document.getElementById(id);
};

window.$tag = function(tag, elem) {
return (elem || document).getElementsByTagName(tag);
};

window.$A = function(obj) {
var ret = [];
for (var i = 0, l = obj.length; i < l; i++) {
ret.push(obj[i]);
}
return ret;
};
function tableSorter(opt) {
this.init(opt);
}

tableSorter.prototype = {
/**
*opt参数:{el:表格id,sortRows:要排序的列,sortcallback:排序后执行的函数}
*/
init: function(opt) {
this.el = $id(opt.el);//表格
this.sortcallback = opt.sortcallback;
this.sortRows = opt.sortRows;
this.orderRule = [];//各列的排序方向:升序、倒序
this.bindEvents();
},
bindEvents: function() {
this.rows = $A(this.el.tBodies[0].rows)/*Array.prototype.slice.call(this.el.tBodies[0].rows)似乎在ie下行不通?*/;
this.ths = this.el.tHead ? this.el.tHead.rows[0].cells : this.rows.shift().cells;/*表格没有定义thead就取第一行*/

var l = this.sortRows ? this.sortRows.length : this.ths.length;/*不指定要排序的列则默认所有列排序*/

if (this.sortRows)
if (!this.ths[this.sortRows[l - 1]])
throw new Error('index out of range');/*列不存在*/

for (var i = 0, current = null, rowIndex = -1; i < l; i++) {
rowIndex = this.sortRows ? this.sortRows[i] : i;
current = this.ths[rowIndex];
current.onclick = this.getFunc(this, 'sort', rowIndex);
current.style.cursor = "pointer";
this.orderRule[rowIndex] = false;/*默认倒序*/
}
},
getFunc: function(variable, method, param) {
return function() {
variable[method](param);
}
},
sort: function(rowIndex) {
var me = this;
this.rows = this.rows.sort(function(a, b) {
a = a.cells[rowIndex].innerHTML;/*列内容*/
b = b.cells[rowIndex].innerHTML;
a = isNaN(a) ? a : parseFloat(a);/*判断是否为数字再决定转换*/
b = isNaN(b) ? b : parseFloat(b);
var order = a < b;
if (me.orderRule[rowIndex])
order = !order;/*与本列上一次排序方向相反*/
return order ? 1 : -1;
});

this.addStyle(rowIndex);
this.lastSorted = this.ths[rowIndex];/*设置最后一次被排序的列为当前列*/
this.orderRule[rowIndex] = !this.orderRule[rowIndex];/*改变下次本列排序方向*/

var _frag = document.createDocumentFragment();/*创建文档碎片,这样只需调用一次appendChild*/
for (var i = 0, l = this.rows.length; i < l; i++)
_frag.appendChild(this.rows[i]);
this.el.tBodies[0].appendChild(_frag);/*此时的appendChild只是移动原有行位置*/

if (this.sortcallback)
this.sortcallback(this.ths[rowIndex], this.orderRule[rowIndex]);
},
addStyle: function(rowIndex) {
if (this.lastSorted)
this.lastSorted.style.background = '';/*清除最后一次被点击的(标题列?)样式*/
this.ths[rowIndex].style.background = this.orderRule[rowIndex] ? 'red' : 'blue';
}
}
var tsort = new tableSorter({
el:'tbsort',
sortRows:[0,2,3,5,6],
sortcallback:function(row, asc) {/*row: tablerow, asc: Boolean*/

}
});
</script>

 回复 引用 查看   
#27楼2008-04-21 08:09 | 专研.NET      

 回复 引用 查看   
#28楼2008-04-21 09:29 | 风景      
--引用--------------------------------------------------
专研.NET: <img src="http://www.cnblogs.com/Emoticons/others/fangdian001.gif" alt="" /><img src="http://www.cnblogs.com/Emoticons/qface/055243188.gif" alt="" />

--------------------------------------------------------

 回复 引用 查看   
#29楼2008-04-21 09:33 | 阿新      
能不能加个功能,比如单击一行返回当前行的记录!!!!!

 回复 引用 查看   
#30楼2008-04-21 10:00 | 王孟军!      
在AJAX没有流行之前
当朋友说到JS时,"不屑一顾"
现在...
哎,精通JS的是"国宝了"
我的email wmj2212@126.com
请多指教

 回复 引用 查看   
#31楼[楼主]2008-04-21 10:02 | 狼Robot      
@王孟军!
我也只是菜鸟一个,呵呵,有时间多多交流.

 回复 引用 查看   
#32楼2008-04-21 10:19 | MarkZT      
这个demo有营养~
 回复 引用 查看   
#33楼[楼主]2008-04-21 10:32 | 狼Robot      
@xiaoming
代码不错,有空多多指教.

 回复 引用 查看   
#34楼2008-04-23 19:40 | smile^_^      
呵呵,很有意思!
学习了,谢谢!

 回复 引用 查看   
#35楼2008-05-31 23:24 | 火无极      
很强大,学习!
 回复 引用   
#36楼2008-07-01 23:25 | chenqz[未注册用户]
感谢lz,非常谢谢,我正好满世界的找,呵呵
 回复 引用   
#37楼2008-07-01 23:30 | chenqz[未注册用户]
再看一遍,简直是太完美了,谢谢
 回复 引用   
#38楼2008-07-01 23:31 | chenqz[未注册用户]
以后有时间我会经常过来你的blog踩踩的
 回复 引用 查看   
#39楼[楼主]2008-07-23 10:13 | 狼Robot      
@smile^_^
@火无极

同学

@chenqz
谢谢

 回复 引用   
#40楼2008-08-13 12:45 | GerryLiang[未注册用户]
兄弟,你是天下第一大好人,太谢谢了!
 回复 引用   
#41楼2008-08-21 11:48 | jisen007[未注册用户]
相当不错!@
 回复 引用 查看   
#42楼[楼主]2008-09-17 16:50 | 狼Robot      
@GerryLiang
@jisen007
谢谢两位夸奖.