JavaScript学习笔记9--表格排序

这次的例子,只是把Nicholas C .Zakas的例子理解了一下,代码是在学习表格排序时的Demo.
单个数据类型的排序比较简单,他这个例子的特别之处在于能兼容多种数据类型的排序。例子
很简单,但是里面有些设计思想给我启发很大,每次看他的书,都有新的收获。
< html >
< head >
< title > SortTable2 </ title >
< meta http-equiv ="content-type" content ="text/html;charset=UTF-8" >
< script type ="text/javascript" >
/* *************************************************************************
排序的主方法,有三个形参,STableTd,iCol,sDataType分别为需要排序的表格ID,
需要排序的表格列号,所在列的数据类型(支持int,float,date,string四种数据类型)
*************************************************************************
*/
function sortTable(sTableId,iCol,sDataType){
var oTable = document.getElementById(sTableId); // 获取表格的ID
var oTbody = oTable.tBodies[ 0 ]; // 获取表格的tbody
var colDataRows = oTbody.rows; // 获取tbody里的所有行的引用
var aTRs = new Array; // 定义aTRs数组用于存放tbody里的行
for ( var i = 0 ;i < colDataRows.length;i ++ ){ // 依次把所有行放如aTRs数组/
aTRs.push(colDataRows[i]);
}
/* **********************************************************************
sortCol属性是额外给table添加的属性,用于作顺反两种顺序排序时的判断,区分
首次排序和后面的有序反转
***********************************************************************
*/
if (oTable.sortCol == iCol){ // 非首次排序
aTRs.reverse();
}
else { // 首次排序
aTRs.sort(generateCompareTRs(iCol,sDataType));
}
var oFragment = document.createDocumentFragment(); // 创建文档碎片/
for ( var i = 0 ;i < aTRs.length;i ++ ){ // 把排序过的aTRs数组成员依次添加到文档碎片
oFragment.appendChild(aTRs[i]);
}
oTbody.appendChild(oFragment);
// 把文档碎片添加到tbody,完成排序后的显示更新
oTable.sortCol = iCol; // 把当前列号赋值给sortCol,以此来区分首次排序和非首次排序,//sortCol的默认值为-1

};

// 比较函数,用于两项之间的排序
function generateCompareTRs(iCol,sDataType){
return function compareTRs(oTR1,oTR2){
var vValue1 = convert(oTR1.cells[iCol].firstChild.nodeValue,sDataType);
var vValue2 = convert(oTR2.cells[iCol].firstChild.nodeValue,sDataType);
if (vValue1 < vValue2){
return - 1 ;
}
else if (vValue1 > vValue2){
return 1 ;
}
else {
return 0 ;
}
};
};
// 数据类型转换函数
function convert(sValue,sDataType){
switch (sDataType){
case " int " : return parseInt(sValue);
case " float " : return parseFloat(sValue);
case " date " : return new Date(Date.parse(sValue));
default : return sValue.toString();
}
};
</ script >

</ head >

< body >
< form name ="f1" id ="f1" action ="" method ="post" >
< table border ="1" id ="tblSort" sortCol ="-1" >
< thead >
< tr >
< th onclick ="sortTable('tblSort',0)" style ="cursor:pointer" > LastName </ th >
< th onclick ="sortTable('tblSort',1)" style ="cursor:pointer" > FirstName </ th >
< th onclick ="sortTable('tblSort',2,'date')" style ="cursor:pointer" > Birthday </ th >
< th onclick ="sortTable('tblSort',3,'int')" style ="cursor:pointer" > Silbings </ th >
</ tr >
</ thead >
< tbody >
< tr >
< td > Simth </ td >
< td > John </ td >
< td > 7/12/1978 </ td >
< td > 2 </ td >
</ tr >
< tr >
< td > Johnson </ td >
< td > Betty </ td >
< td > 5/12/1965 </ td >
< td > 5 </ td >
</ tr >
< tr >
< td > Henderson </ td >
< td > Nathan </ td >
< td > 10/15/1977 </ td >
< td > 3 </ td >
</ tr >
< tr >
< td > Willianms </ td >
< td > James </ td >
< td > 2/25/1949 </ td >
< td > 1 </ td >
</ tr >
< tr >
< td > Gilliam </ td >
< td > Michael </ td >
< td > 7/8/1980 </ td >
< td > 4 </ td >
</ tr >
< tr >
< td > Walker </ td >
< td > Matthew </ td >
< td > 6/18/1981 </ td >
< td > 3 </ td >
</ tr >
</ tbody >
</ table >
</ form >
</ body >
</ html >

排序前:

按Birthday排序后:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值