JavaScript Table排序

序二(09/05/03)

近来还是那么忙,趁五一更新一下程序吧。
这个版本主要增加和改进了以下东西:
1,对字符串改用localeCompare来比较;
2,一次排序中能使用多个排序对象(用于值相等时再排序);
3,修正一些发现的问题;
4,改进程序结构,个人觉得是更灵活更方便了;
5,增加bool类型比较;
6,添加attribute/property的内容;
7,修正ie6/7的radio/checkbox状态恢复bug;
8,增加自定义取值函数。


序一(08/10/06)

前一阵做了个网盘,用到了table的排序,趁热打铁做一个完整的table排序类出来。
程序的实现的是在客户端对表格进行排序,有以下特点:
1,自定义排序列、排序属性(例如innerHTML)、排序数据类型(包括int、float、date、string)、排序顺序(顺序和倒序);
2,自定义排序函数;
3,可同时设置多个排序列;

网上也有很多其他的table排序函数,但有的是基于数组,有的不够灵活。本程序是在原有table结构上加入功能,套用一个流行词叫“无侵入”。


效果预览

点击表头排序

ID  名称 / 类型 上传时间 大小
1 new.htm 2008/9/12 423.09 K
2 Scroller.js 2008/9/23 2.5 K
3 AlertBox.js 2008/9/23 3.48 K
4 1.xml 2008/10/4 11.13 K
5 4.xml 2008/10/4 108 b
6 news.htm 2008/10/4 13.74 K
7 function.js 2008/10/4 2.78 K
8 神秘园 - Nocturne.mp3 2008/9/20 2.97 M
9 详细功略+剧情流程(一).doc 2009/2/2 62 K
10 详细功略+剧情流程(二).doc 2009/2/2 160.5 K
11 禁止文件预览功能.txt 2008/8/7 860 b
12 超级无敌精彩的效果集合.txt 2009/2/2 351 b

有中文的先排前面,再按时间倒序,ID倒序排序:



基本步骤

1,把需要排序的行放到tbody中(程序会直接取tbody的rows);

2,把排序行放到一个数组中;

this._rows = $$A.map(tBody.rows, function(o){ return o; });


3,按需求对数组进行排序(用数组的sort方法); 

this._rows.sort($$F.bind( this._compare, this, orders, 0 ));


4,用一个文档碎片(document.createDocumentFragment())保存排好序的行;

var frag = document.createDocumentFragment();
$$A.forEach(
this._rows, function(o){ frag.appendChild(o); });


ps:文档碎片并不是必须的,但建议使用,大量dom操作时使用文档碎片会更有效率。

5,把文档碎片插入到tbody中。

this._tBody.appendChild(frag);

 

程序说明

【排序函数】

排序就不得不说数组中sort这个方法,手册是这样介绍的:返回一个元素已经进行了排序的 Array 对象。也就是对一个数组进行排序,很多跟排序相关的操作都用到这个方法。

默认按照 ASCII 字符顺序进行升序排列,使用参数的话可以自定义排序方法,程序的compare程序就是用来自定义排序的。
一般来说排序函数会有两个默认参数分别是两个比较对象,程序中根据需要在调用compare时bind了两个参数,所以会有4个参数。
要注意,排序函数必须返回下列值之一:
负值,如果所传递的第一个参数比第二个参数小。
零,如果两个参数相等。
正值,如果第一个参数比第二个参数大。

在取得比较值(后面说明)之后就进行值的比较。
程序中如果是字符串,会用localeCompare获取比较结果,否则就直接相减得到比较结果:

result = od.compare ? od.compare(value1, value2) :
    
typeof value2 == "string" ? value1.localeCompare(value2) : (value1 - value2);


如果desc属性是true(降序排序),那么在result的基础上乘以-1就能得到相反的排序了:

(od.desc ? -1 : 1* result



【获取比较值】

程序中是根据排序对象和_value方法从每个tr中获取比较值的。
首先通过index(td索引)和property(属性)获取对应的值。
如果没有适合的属性放要比较的值的话,可以给td设一个自定义属性来放这个值(如例子中的_ext)。
对于在html中设置的自定义属性,ie可以用[x]和getAttribute来取,而ff就只能用getAttribute来获取(后面会详细说明)。
所以只需考虑ff的情况就行了,程序中用in来判断这个属性是否可以用[x]方式获取:

var td = tr.cells[order.index], att = order.property
    ,data 
= order.value ? order.value(td) :
        att 
in td ? td[att] : td.getAttribute(att);


如果in运算是true,那么可以用关键词方式取值,否则用getAttribute来取。
取得值之后就进行比较值转换:

Code


这里会把日期用Date.parse转化成整数的形式方便比较,但要注意Date.parse的参数必须符合js的日期格式(参考这里)。
对于bool值的比较,会判断是不是true或字符串的"true",其他都一律看成false。
ps:如果觉得添加自定义属性不符合标准,可以考虑放在title之类的属性中。


【attribute/property】

在获取比较值的时候会用in来判断是否可以用[x]方式,其实是判断该属性是属于attribute还是property。
那attribute和property到底是什么呢,有什么区别呢?这个或许很多人都没留意,或许认为是同一个东西。
要明确attribute和property是不同的东西就要先知道它们分别是什么,这个很难说得清,举些例子就明白了。
这里我们先以ff为标准,后面再说ie的区别。以div为例,查查网页制作完全手册,会找到它有以下属性:
ALIGN      align
CLASS      className
ID            id
TITLE       title
...            ...
其中第一列就是attribute,第二列就是property。
attribute是dom元素在文档中作为html标签拥有的属性,property就是dom元素在js中作为对象拥有的属性。
例如在html中dom作为页面元素应该直接用class属性,对应在js中作为dom对象就必须用className属性。
由于attribute是不分大小写的,这使得大部分的attribute和property看起来会一样,使人误以为同一个东西(当然ie的责任也很大)。
还不相信的话可以用ff看看下面的例子:

<div id="t" tt="1">test</div>
<script>
var o = document.getElementById('t');
o[
"tt"]="2";
document.writeln(o.getAttribute(
"tt"));
document.writeln(o[
"tt"]);
</script>


可以看出getAttribute和[x]方式得到了不同的答案。
这里必须先说说getAttribute和[x]方式的区别,getAttribute和setAttribute是专门用来获取和设置attribute的,
而[x]方式就是获取和设置property属性的,这个property跟我们一般操作的js对象的属性是一样的。
或许有人会有疑问,像id,title不是都指向同一个属性吗,修改property对应attribute也会跟着修改。
其实我们也可以自定义一个这样的属性,在ff测试下面的代码:

Code


这样就实现了“修改property对应attribute也会跟着修改”的属性了。
从测试例子还可以看到attribute跟对应的property完全可以使用不一样的属性名,像class和className的效果。
也能在Getter中对attribute的值进行处理再返回,就像href的property值是attribute的完整路径形式。
而property可以没有对应的attribute,反过来也一样,像innerHTML这样的property就没有对应的attribute。
ps:以上只是说明实现的原理,事实上并不需要这样来实现。

既然知道attribute和property是不同的东西,那如何分辨一个属性是属于attribute还是property呢。
我们可以用in来判断property,用hasAttribute判断attribute。
但ie6/7没有hasAttribute,是不是只能用in来判断呢?对了一半,因为ie6/7根本就不需要hasAttribute。
在ie6/7中,并没有很好地区分attribute和property。例如ie6/7运行下面代码:

Code


可以看到,里面基本没有attribute和property之分,而ie8的结果除了getAttribute("innerHTML"),其他跟ie6/7一样。
当然我觉得ie的制作者肯定知道attribute和property的区别,只是他们为了得到使用者想当然的结果,所以才这么弄。
本来被这么忽悠也没什么不好,但后来我发现一个问题:

<div id="t" class="a">test</div>
<script>
var o = document.getElementById('t');
o.setAttribute(
"class","b");
alert(o.outerHTML);
</script>


这样修改的样式是无效的,按照ie的规矩要使用className,但问题是从outerHTML中居然看到div标签中有两个class属性。
之前我一直都不知如何理解ie这个现象,不过这在ie8中已经得到了修正。
在ie8中已经把attribute和property区分开了(详细看Attribute Differences in Internet Explorer 8)。
例如getAttribute("innerHTML")返回的是null,说明innerHTML不再是attribute;setAttribute("class",x)修改的是attribute,不再是给dom元素添加一个莫名其妙的class属性;貌似getAttribute也没有了第二个参数(getAttribute的第二个参数可以看这里);还有name属性的混乱问题也正常了(参考这里)。
不过ie8依然使用添加新属性会同时是attribute和property的模式,估计还是为了兼容之前的版本,可怜的ie8。

ps:以上都以[x]为例子,而使用.运算符的效果跟[x]是一样的。
ps2:由于对dom没有很深入的了解,这部分可能会有问题,欢迎各位指出。
ps3:发现自己的dom知识太少,正准备找本dom的书看看。

 

【radio/checkbox的checked状态bug】

可以用ie6/7测试下面代码:

Code


先点选checkbox和radio,然后点击按钮,在ie6会发现checkbox和radio都恢复到没有点选的状态,ie7好点只是radio有问题。
而且新插入的checkbox和radio虽然checked都设置成true,但显示出来还是没有选择的状态。
这里其实都是一个问题,checkbox和radio在一些dom操作之后(例如这里的appendChild),checked会自动恢复成defaultChecked的状态。
创建元素的问题可以参考这里
程序中tr在排序后会用appendChild重新插入文档,结果就会导致上面的问题了,解决方法暂时想到三个:
1,在appendChild之前修改defaultChecked。
针对appendChild后会自动恢复成defaultChecked,那我们就在appendChild前把defaultChecked修改成当前的checked值。
这个解决方法不错,只要appendChild之前扫一遍表单控件就行,但问题是这会影响到reset的结果,因为reset之后checkbox/radio的checked就会恢复成defaultChecked的值,如果修改了defaultChecked那reset就失去了效果。
2,在appendChild之前保存checked的状态,并在appendChild之后恢复。
要实现这个也有两个方法,一个是用一个数组或对象来保存checkbox/radio当前的checked值,在appendChild之后找出对应的值并设置。
另一个是直接把checkbox/radio当前的checked值保存到该控件的一个自定义属性中,在appendChild之后再获取并设置。
两个方法都要扫两次表单控件,后者比较方便。
3,在appendChild之前找出checked跟defaultChecked不相等的控件,并在appendChild之后重新设置这些控件。
这个方法比前一个稍好,只要在appendChild之前扫一遍控件,并筛选出需要修正的(checked跟defaultChecked不相等的),在appendChild之后设置checked为defaultChecked的相反值就行了。

程序用的是第3个方法,在appendChild之前用_getChecked方法获取要修正的checkbox/radio集合:

this._checked = $$A.filter(this._tBody.getElementsByTagName("input"), function(o){
    
return (($$B.ie6 && o.type == "checkbox"|| o.type == "radio"&&
        o.checked 
!= o.defaultChecked;
});


在appendChild之后用_setChecked重新设置checked值:

$$A.forEach(this._checked, function(o){ o.checked = !o.defaultChecked; });


但这样效率还是比较低,所以除了考虑浏览器:

_repair: $$B.ie6 || $$B.ie7,


还可以自定义的repair来决定是否需要修正:

var repair = this._repair && $$A.some(orders, function(o){ return o.repair; });


如果有更好的方法记得告诉我啊。


【排序对象】

为了程序的更灵活,加了一个排序对象的东西。
这个排序对象有以下属性:
属性  默认值//说明
index:  0,//td索引
property: "innerHTML",//获取数据的属性
type:  "string",//比较的数据类型
desc:  true,//是否按降序
compare: null,//自定义排序函数
value:  null,//自定义取值函数
repair:  this._repair,//是否解决checkbox和radio状态恢复bug
onBegin: function(){},//排序前执行
onEnd:  function(){}//排序后执行

可以看出这个排序对象就是用来保存该排序的规则和方式的,也就是用来告诉程序要怎么排序。
采用这个模式是因为一个table通常同时需要多个不同的排序方式,使用排序对象就像玩拳王选人,哪个适合就用哪个。
而程序在一次排序过程中还可以设置多个排序对象,当比较值相等时,再用下一个排序对象比较。
用这个方式会更方便,重用性更好。

程序中通过creat程序来创建排序对象,其参数就是自定义的属性:

return $$.extend($$.extend({}, this.options), options || {});


执行sort程序就会进行排序,但必须一个或多个的排序对象为参数。
在sort程序中会先把排序对象参数转换成数组:

var orders = Array.prototype.slice.call(arguments);


然后传递到_compare程序中,当比较结果是0(即相等),同时有下一个排序对象,就会用下一个排序对象继续_compare:

return !result && od[++i] ? this._compare(orders, i, tr1, tr2) : (od.desc ? -1 : 1* result;


这样的方式可以最大限度的利用已建立的排序对象。


使用方法

首先实例化一个主排序对象,参数是table的id:

var to = new TableOrder("idTable");


如果需要设置默认属性,一般建议在new的时候设置。

接着用creat方法添加一个排序对象,参数是要设置的属性对象(参考【排序对象】):

odID = to.creat({ type: "int", desc: false })


然后就可以用sort方法配合排序对象为参数来排序了:

to.sort(order, odID);

 

程序源码 

Code

 

下载完整实例

转载请注明出处:http://www.cnblogs.com/cloudgamer/

如有任何建议或疑问,欢迎留言讨论。

如果觉得文章不错的话,欢迎点一下右下角的推荐。

程序中包含的js工具库CJL.0.1.min.js,原文在这里

posted @ 2008-10-06 08:24 cloudgamer 阅读(38489) 评论(76) 编辑 收藏

 回复 引用 查看   
#1楼 2008-10-06 08:41 偷学.net      
代码发来学习一下!!
 回复 引用 查看   
#2楼 2008-10-06 10:12 Ma Liang      
代码发我一份,谢谢。
maliangnet@126.com

 回复 引用 查看   
#3楼[楼主] 2008-10-06 11:00 cloudgamer      
@偷学.net
@Ma Liang
谢谢支持
代码稍后会放出下载的

 回复 引用 查看   
#4楼 2008-10-06 20:12 collinye      
很不错啊,代码风格很清晰。
 回复 引用 查看   
#5楼[楼主] 2008-10-06 21:24 cloudgamer      
@collinye
谢谢支持

 回复 引用 查看   
#6楼 2008-10-07 08:55 iMax Shi      
太好了
 回复 引用 查看   
#7楼[楼主] 2008-10-07 09:58 cloudgamer      
@iMax Shi
谢谢

 回复 引用   
#8楼 2008-10-07 14:39 heroguang[未注册用户]
看不懂,现在要用,是个普通的表格存放学生的信息(名字是英文也可以),能不能给修给一个简单的按照字母排序,点击后反向就可以了!!!最好表格隔行颜色不同!!
谢谢!!!!

 回复 引用 查看   
#9楼[楼主] 2008-10-07 15:04 cloudgamer      
@heroguang
这个还是你自己来研究吧
上面的使用方法应该说的比较清楚的了

 回复 引用 查看   
#10楼 2008-10-08 17:01 狼Robot      
早前看过,没留言,看到你在我的bolg回复,又过来看了一次,呵呵.学习.
 回复 引用 查看   
#11楼[楼主] 2008-10-08 17:27 cloudgamer      
@狼Robot
呵呵
多多交流

 回复 引用   
#12楼 2008-10-08 20:52 yaoruoshui[未注册用户]
多谢分享!真是谢谢了!
 回复 引用 查看   
#13楼[楼主] 2008-10-08 23:08 cloudgamer      
@yaoruoshui
谢谢支持

 回复 引用 查看   
#14楼 2008-10-10 22:42 Freewind      
楼主JS很强啊
 回复 引用 查看   
#15楼[楼主] 2008-10-10 23:58 cloudgamer      
@Freewind
呵呵
谢谢

 回复 引用 查看   
#16楼 2008-10-17 15:19 allenjsl      
请问table里有表单控件,是否适用?
 回复 引用 查看   
#17楼[楼主] 2008-10-17 15:46 cloudgamer      
@allenjsl
可以“给td设置了一个属性来放这个比较值”
或者自己写一个比较函数

 回复 引用   
#18楼 2008-10-20 11:49 nianshi[未注册用户]
很好啊 学习了
 回复 引用 查看   
#19楼[楼主] 2008-10-20 18:35 cloudgamer      
@nianshi
谢谢支持

 回复 引用   
#20楼 2008-11-02 21:03 hjx398[未注册用户]
高人啊,收藏了
 回复 引用 查看   
#21楼[楼主] 2008-11-03 23:06 cloudgamer      
@hjx398
谢谢

 回复 引用   
#22楼 2008-11-10 09:54 鼻涕[未注册用户]
有JAVA S的教程吗-。-我想学习。可以发到我的MAIL里
 回复 引用   
#23楼 2008-11-20 09:14 文西[未注册用户]
如果有汉字参与排序,就不好弄了
 回复 引用 查看   
#24楼[楼主] 2008-11-20 09:25 cloudgamer      
@鼻涕
没有教程哦
看书吧
javascript高级程序设计不错

@文西
用localeCompare 应该可以
有时间加上

 回复 引用   
#25楼 2008-11-28 08:52 James23[未注册用户]
用JQ的很容易实现喔
 回复 引用 查看   
#26楼[楼主] 2008-11-28 10:55 cloudgamer      
@James23
我这里是说原理不是做效果
只需要效果的话就不用来这里了

 回复 引用   
#27楼 2008-12-17 15:23 ddg[未注册用户]
代码写的很难理解,也许这样能显示出来你水平的高深吧。
 回复 引用 查看   
#28楼[楼主] 2008-12-17 15:35 cloudgamer      
@ddg
其实就几行代码,哪有什么高深不高深的
有什么不理解的可以一起讨论

 回复 引用 查看   
#29楼 2008-12-25 11:21 zhwily      
我想问一些:对于有多个分页的这个可以吗?

例如:第一页里面显示的数据全是没有x的,点排序的时候,能把第2页的带X的列出来吗?

 回复 引用 查看   
#30楼[楼主] 2008-12-25 14:09 cloudgamer      
@zhwily
这样除非你一次过把数据都载入
再按分页显示(这里没有分页功能)

 回复 引用 查看   
#31楼 2009-01-12 12:53 鬼神      
很好很强大。一般我不留言,看到你精彩的日记不得不浮上来给你加加油了。呵呵。
 回复 引用 查看   
#32楼 2009-01-12 12:54 鬼神      
--引用--------------------------------------------------
cloudgamer: @zhwily
这样除非你一次过把数据都载入
再按分页显示(这里没有分页功能)
--------------------------------------------------------
建议使用COOKIES保存设置的状态。翻页时再读取设置。

 回复 引用 查看   
#33楼 2009-02-07 09:56 依依园地      
牛年开工后博客园上读的第一个牛人的文章,支持加学习ing。
 回复 引用   
#34楼 2009-02-13 17:03 的速度撒[未注册用户]
不错啊 学习一下
我找了好久 我都没找到

 回复 引用   
#35楼 2009-02-21 17:41 mymickey[未注册用户]
'return __method.apply(object, args.concat(Array.prototype.slice.call(arguments)))'
请问里面的arguments是从哪里获取到的,但是看起来好像应该是bind的参数,
但是却不是。求解。!

 回复 引用 查看   
#36楼[楼主] 2009-02-21 17:48 cloudgamer      
@鬼神
@依依园地
@的速度撒
谢谢支持

@mymickey
arguments是JavaScript内置对象
你可以百度一下

 回复 引用   
#37楼 2009-02-21 20:09 qweq12[未注册用户]
__method在这里可以指向 包含他的匿名函数对吧。那这个arguments就是这个函数的参数 可以这样理解吧
 回复 引用 查看   
#38楼[楼主] 2009-02-21 20:41 cloudgamer      
@qweq12
args.concat(Array.prototype.slice.call(arguments)))
args是bind时的参数
arguments是调用这个函数时的参数

 回复 引用   
#39楼 2009-05-04 19:34 kendyhua
请问如果有多列相同类型的怎么办呢?好像排序就不正确了啊。

如有: 名称1 名称2 名称3 名称4 时间1 时间2 时间3

 回复 引用 查看   
#40楼[楼主] 2009-05-04 20:15 cloudgamer      
@kendyhua
列跟列是独立的
没明白你的意思

 回复 引用   
#41楼 2009-05-20 10:12 haiyang
这个比较实在
 回复 引用   
#42楼 2009-05-20 10:14 haiyang
对了 博主 可否推荐点JS 的实例教程 由潜入深的 网上的都不规范
我想博主 肯定知道怎么学 该怎么练习 一点点深入 谢谢了阿 !

 回复 引用 查看   
#43楼[楼主] 2009-05-20 10:26 cloudgamer      
@haiyang
也就是多看书
有空就研究高手的代码
js本来就没有规范不规范的,每个人的代码风格都不尽相同

 回复 引用   
#44楼 2009-06-20 22:18 hurong09[未注册用户]
可否增加一个表格隔行变色的功能啊,排序前和排序后都是隔行变色
 回复 引用 查看   
#45楼[楼主] 2009-06-22 08:42 cloudgamer      
@hurong09
这个跟排序没有关系的啊

 回复 引用   
#46楼 2009-07-10 11:21 无名小卒~[未注册用户]
看了你的文章后心情很激动顶一个继续加油!
 回复 引用 查看   
#47楼[楼主] 2009-07-12 13:36 cloudgamer      
@无名小卒~
谢谢支持

 回复 引用   
#48楼 2009-08-27 16:53 meteor11[未注册用户]
修改页面上这段Javascript,觉得有些不灵活,为什么不直接在排序操作上加函数和对应的参数呢?
比如:
<a href="#" onclick="tdSort('int')">序号</a>
<a href="#" onclick="tdSort('string')">名称</a>

这样不是更简便?不用在每个页面还去写Javascript。

我的代码:
<table width="100%" border="0" cellspacing="0" cellpadding="0" id="idTable">
<thead>
<tr>
<td class="datatitletd">编号</td>
<td class="datatitletd"><a href="javascript:void(0)" id="idSize">重量</a></td>
</tr>
</thead>
<tbody>
<tbody>
<tr>
<td class="datalisttd">A0001</td>
<td class="datalisttd" _order="1236">1.236g</td>
</tr>
<tr>
<td class="datalisttd">A0002</td>
<td class="datalisttd" _order="1215">1.215g</td>
</tr>
<tr>
<td class="datalisttd">A0003</td>
<td class="datalisttd" _order="1538">1.538g</td>
</tr>
</tbody>
</table>
<script type="text/javascript">
var to = new TableOrder("idTable"), odID = to.Creat({ DataType: "string", Desc: false }), arrOrder = [];
function ClearCss(){ forEach(arrOrder, function(o){ o.className = ""; }); }
function SetOrder(obj, options){
var o = $(obj), order = to.Creat(options);
order.startSort = function(){ ClearCss(); odID.Desc = this.Desc; }
order.endSort = function(){
o.className = this.Desc ? "down" : "up";//设置样式
this.Desc = !this.Desc;//取反排序
}
o.onclick = function(){ to.Sort(order, odID); return false; }
arrOrder.push(o);//记录排序项目(这里主要用来设置样式)
}
SetOrder("idSize", { Index: 3, Attri: "_order", DataType: "int" });
</script>

点击“重量”后,无法排序,请问是什么原因?

 回复 引用 查看   
#49楼[楼主] 2009-08-27 17:21 cloudgamer      
@meteor11
现在流行js html分离,叫“无侵入”

大哥这样照搬当然有问题啦
先看懂代码吧
首先你有两个<tbody>,去掉一个
idSize的Index是1不是3

 回复 引用   
#50楼 2009-08-27 19:53 meteor11[未注册用户]
博主,回复真快。index是1不是3,其实在我本地的“重量”是在第4列(只是不想复制太多),还是无法排序。

我JS很菜,不知道楼主,能否提供一个“无侵入”的示例?谢谢!

 回复 引用 查看   
#51楼[楼主] 2009-08-27 20:35 cloudgamer      
@meteor11
你把贴这里的代码去掉一个<tbody>,idSize的Index改1就行了

 回复 引用   
#52楼 2009-09-02 11:30 hqula[未注册用户]
<table>
<table class="odTable" id="idTable${item.goodsId}">
</table>
</table>
如果循环这个odTable,如何解决排序?
有没有类似jQuery的方法取得对象?

 回复 引用 查看   
#53楼[楼主] 2009-09-02 13:58 cloudgamer      
@hqula
每个table都实例化一个咯

 回复 引用   
#54楼 2009-09-09 15:29 大话西游[未注册用户]
表头的ID是唯一的,如果表里面其中二列的类型是一样的话,那第一个列排序有用,第二个列就没有用了.碰到这样的情况如何处理

 回复 引用 查看   
#55楼[楼主] 2009-09-09 17:07 cloudgamer      
@大话西游
每列的排序都是独立的吧
不是很明白你的意思

 回复 引用 查看   
#56楼 2009-09-17 11:57 ForFreeDom      
是我见过的国内最强js博客,最最可贵的是楼主的分享精神!!!!
 回复 引用 查看   
#57楼[楼主] 2009-09-17 13:58 cloudgamer      
@ForFreeDom
谢谢支持

 回复 引用   
#58楼 2009-10-15 16:43 day[未注册用户]
请问这个对比如何查看效果? 勾选了似乎没有变化,还有那个R是什么意思?
 回复 引用 查看   
#59楼[楼主] 2009-10-15 17:05 cloudgamer      
@day
那两列是checkbox和radio的排序

 回复 引用   
#60楼 2009-12-15 23:07 leftround[未注册用户]
在本地调试你的文件没有问题,可是放进我的blog里怎么没有产生效果,blog程序为wordpress,希望得到帮助,谢谢
 回复 引用 查看   
#61楼[楼主] 2009-12-15 23:41 cloudgamer      
@leftround
可能有冲突吧
看看是不是$

 回复 引用   
#62楼 2009-12-16 10:04 leftround[未注册用户]
是$问题要怎么解决呢,看下网页错误总提示tableorder未定义
 回复 引用 查看   
#63楼[楼主] 2009-12-16 11:23 cloudgamer      
@leftround
如果是$冲突的话替换成其他符号例如$$$就行了
具体只能你自己测试了

 回复 引用   
#64楼 2009-12-16 12:42 leftround[未注册用户]
发现在ff下无任何问题,只有ie6测试总提示错误,好像不运行某个方法属性
 回复 引用   
#65楼 2009-12-16 13:31 leftround[未注册用户]
在ie7下测试也没有问题,估计是ie6版本对某些方法不支持
 回复 引用 查看   
#66楼[楼主] 2009-12-16 14:56 cloudgamer      
@leftround
这就不好说了

 回复 引用   
#67楼 2010-04-27 17:54 byshome[未注册用户]
我使用你的排序,如果这个table是html的,排序没有问题
但是如果表格是js动态insertRow与insertCell的,则排序的时候,在
GetValue:function(order, tr) 的时候,tr.cells无效,为什么?

 回复 引用 查看   
#68楼[楼主] 2010-04-27 22:13 cloudgamer      
@byshome
因为程序在初始化时就获取(确定)了排序行
如果之后在插入的行就没有加入排序了

 回复 引用 查看   
#69楼 2010-06-30 15:21 舞千愁      
不错啊。
 回复 引用   
#70楼 2011-01-06 17:34 piaoguo[未注册用户]
很工整,还要自己研究一下
 回复 引用   
#71楼 2011-01-13 17:18 chinamen[未注册用户]
楼主你的JS确实很强,要是代码写的更通俗点,就更好了
 回复 引用   
#72楼 2011-01-24 13:46 ETCentury[未注册用户]
呵呵,到此处学习学习~!
 回复 引用   
#73楼 2011-02-25 10:25 hosser[未注册用户]
这样js的排序是不是只是针对某一页的.如果我要所有页面的排序,当然不可以使用js 的数组了.
 回复 引用 查看   
#74楼[楼主] 2011-02-25 16:41 cloudgamer      
@ETCentury
@chinamen
@piaoguo
@舞千愁
谢谢支持

 回复 引用 查看   
#75楼[楼主] 2011-02-25 16:42 cloudgamer      
@hosser
你说的没错
除非你用js来分页

 回复 引用   
#76楼 2011-08-20 14:41 cc258[未注册用户]
<div id="t" tt="1">test</div>
<script>
var o = document.getElementById('t');
o["tt"]="2";
document.writeln(o.getAttribute("tt"));
document.writeln(o["tt"]);
</script>
可以看出getAttribute和[x]方式得到了不同的答案。

===========================================
我测试过了,,,结果都是为2

博主我很感谢你的分享,可是你的表格排序也太复杂了.

上下文也没交待清楚,还需要一个JS工具库,还是加密了的.

使用不方便.

发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1304414 zB7bEDskFlc=