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" > Last Name </ th >            < th  onclick ="sortTable('tblSort',1)"  style ="cursor:pointer" > First Name </ 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、付费专栏及课程。

余额充值