javascript页面排序

sort()方法可用来排列数组中的元素,语法是


代码
arrayObject.sort(sortByRequest)   


注释: 1.sortByRequeset是可选项,指定排列次序。必须是一个函数。
2.sort()默认是没有参数,函数按照字母大小排列。如果是数字按照默认

情况排列,会出现错误(e.g:1,11,2,21)
3.当使用sort()后,array发生改变。

页面表格js排序,首先要得到具体哪个表格,这个不需要讲了吧!


代码
sTable = document.getElementById(tableId);   


表格找到后必须对表格的内容进行应用,即得到表格tbodies的集合.

代码
var tbody = table.tBodies[0];   
var colRows = tbody.rows;   


得到tbodies集合以后放入Array里面


代码
var aTrs = new Array;   
for (var i=0; i < colRows.length; i++) {   
    aTrs[i] = colRows[i];   
}   


所有信息已经准备完毕,我们对array进行排序(也就是上面代码中的aTrs)

代码
aTrs.sort(compareEle());   


其中compareEle()是指定排列次序的函数。
当把数字(aTrs)排列完毕以后,需要重新生成表格


代码
var oFragment = document.createDocumentFragment();               
for(var i=0; i < aTrs.length; i++) {   
     oFragment.appendChild(aTrs[i]);   
}   
     tbody.appendChild(oFragment);   


这样,基本的功能已经介绍已经完成。
如果要在项目中加入这项功能需要考虑以下基本内容
1.浏览器的类型
2.需要定位是对哪一列进行排列
3.需要排列的列的数据类型。
4.是否连续排序(eg:如果按照升序排列以后,再次点击,应该按照降序

列)
所以最终详细设计

代码
function ieOrFireFox(ob)   
{   
     if (ob.textContent != null)   
     return ob.textContent;   
     var s = ob.innerText;   
     return s.substring(0, s.length);   
}   
  
//排序 tableId: 表的id,iCol:第几列 ;dataType:iCol对应的列显示数

据的数据类型   
function sortAble(tableId, iCol, dataType) {   
     var table = document.getElementById(tableId);   
     var tbody = table.tBodies[0];   
     var colRows = tbody.rows;   
     var aTrs = new Array;   
          //将将得到的列放入数组,备用   
     for (var i=0; i < colRows.length; i++) {   
         aTrs[i] = colRows[i];   
     }   
                         
                    
     //判断上一次排列的列和现在需要排列的是否同一个。   
     if (table.sortCol == iCol) {   
         aTrs.reverse();   
     } else {   
         //如果不是同一列,使用数组的sort方法,传进排序函数   
         aTrs.sort(compareEle(iCol, dataType));   
     }   
           
     var oFragment = document.createDocumentFragment();   
                   
     for (var i=0; i < aTrs.length; i++) {   
         oFragment.appendChild(aTrs[i]);   
     }                   
     tbody.appendChild(oFragment);   
     //记录最后一次排序的列索引   
     table.sortCol = iCol;   
}   
//将列的类型转化成相应的可以排列的数据类型   
function convert(sValue, dataType) {   
     switch(dataType) {   
     case "int":   
         return parseInt(sValue);   
     case "float":   
         return parseFloat(sValue);   
     case "date":   
         return new Date(Date.parse(sValue));   
     default:   
         return sValue.toString();   
     }   
}   
               
//排序函数,iCol表示列索引,dataType表示该列的数据类型   
function compareEle(iCol, dataType) {   
     return   function (oTR1, oTR2) {   
         var vValue1 = convert(ieOrFireFox(oTR1.cells[iCol]),

dataType);   
         var vValue2 = convert(ieOrFireFox(oTR2.cells[iCol]),

dataType);   
         if (vValue1 < vValue2) {   
             return -1;   
         } else if (vValue1 > vValue2) {   
             return 1;   
         } else {   
             return 0;   
         }   
        };   
}   


具体使用:
将上述代码保存为 sortable.js,在同一目录下新建sortable.html


代码
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">  
<HTML>  
<HEAD>  
   <TITLE> New Document </TITLE>  
   <script src="sortable.js" type="text/javascript"></script>  
</HEAD>  
  
<BODY>  
<p>Sortable demo:</p>  
         <table border="1" id="tableId">  
             <thead>  
                 <tr>  
                     <th οnclick="sortAble('tableId', 0)"     
                          style="cursor:pointer">name</th>  
                     <th οnclick="sortAble('tableId', 1, 'date')"  
                          style="cursor:pointer">Birthday</th>  
                     <th οnclick="sortAble('tableId', 2, 'int')"   


                          style="cursor:pointer">Age</th>  
                 </tr>  
             </thead>  
             <tbody>  
                 <tr>  
                     <td>Ozone</td>  
                     <td>01/12/1982</td>  
                     <td>25</td>  
                 </tr>  
                 <tr>  
                     <td>OnlyBlue3</td>  
                     <td>10/24/1983</td>  
                     <td>23</td>  
                 </tr>  
                 <tr>  
                     <td>Momo</td>  
                     <td>10/14/1999</td>  
                     <td>8</td>  
                 </tr>  
             </tbody>  
         </table>  
     
</BODY>  
</HTML>  
  


以上例子经过 ie6 和 firefox2.0.0.5调试通过

在项目使用当中,发现如果在页面中,本来表格中没有数据,通过js从其他地

方添加到本页面时,无法进行排序,甚至连onclick事件都不触发。至于为什

么,还没有研究明白。找了一种“偷懒方法”可以解决上述问题。即添加

一个隐藏行。


代码
<HTML>     
   <HEAD>     
    <TITLE> New Document </TITLE>     
    <script src="sortable.js" type="text/javascript"></script>     
   </HEAD>     
      
   <BODY>     
   <p>Sortable demo:</p>     
          <table border="1" id="tableId">     
              <thead>     
                  <tr>     
                      <th οnclick="sortAble('tableId', 0)"       
                           style="cursor:pointer">name</th>     
                      <th οnclick="sortAble('tableId', 1, 'date')"

    
                           style="cursor:pointer">Birthday</th>    


                      <th οnclick="sortAble('tableId', 2, 'int')"  

    
                           style="cursor:pointer">Age</th>     
                  </tr>     
              </thead>     
              <tbody>    
                  <tr style="display:none"></tr>    
                  <tr>     
                      <td>Ozone</td>     
                      <td>01/12/1982</td>     
                      <td>25</td>     
                  </tr>     
                  <tr>     
                      <td>OnlyBlue3</td>     
                      <td>10/24/1983</td>     
                      <td>23</td>     
                  </tr>     
                  <tr>     
                      <td>Momo</td>     
                      <td>10/14/1999</td>     
                      <td>8</td>     
                  </tr>     
              </tbody>     
          </table>     
        
   </BODY>     
</HTML>     

 

最近一直对以前的系统中的表格添加排序功能,发现系统中的表格并没有

<thead></thead><tbody></tbody>这些标签,每次出了给表头添加点击事件

,还要添加而外标签.为了减少工作量,把js做了个小小调整.


代码
function ieOrFireFox(ob){     
      if (ob.textContent != null)     
      return ob.textContent;     
      var s = ob.innerText;     
      return s.substring(0, s.length);     
}     
      
//排序 tableId: 表的id,iCol:第几列 ;dataType:iCol对应的列显示数

据的数据类型     
function sortAble(tableId, iCol, dataType){     
     var table = document.getElementById(tableId);     
     var tbody = table.tBodies[0];     
     var colRows = tbody.rows;     
     var aTrs = new Array;     
     //将将得到的列放入数组,备用     
     for (var i=0; i < colRows.length-1; i++) {     
          aTrs[i] = colRows[i+1];     
     }     
                                                 
//判断上一次排列的列和现在需要排列的是否同一个。     
     if (table.sortCol == iCol) {     
         aTrs.reverse();     
     } else {     
      //如果不是同一列,使用数组的sort方法,传进排序函数     
          aTrs.sort(compareEle(iCol, dataType));     
     }              
     var oFragment = document.createDocumentFragment();     
                    
     for (var i=0; i < aTrs.length; i++) {     
         oFragment.appendChild(aTrs[i]);     
     }                     
     tbody.appendChild(oFragment);     
      //记录最后一次排序的列索引     
     table.sortCol = iCol;     
}     
//将列的类型转化成相应的可以排列的数据类型     
function convert(sValue, dataType) {     
      switch(dataType) {     
      case "int":     
          return parseInt(sValue);     
      case "float":     
          return parseFloat(sValue);     
      case "date":     
          return new Date(Date.parse(sValue));     
      default:     
          return sValue.toString();     
      }     
}     
                  
//排序函数,iCol表示列索引,dataType表示该列的数据类型     
function compareEle(iCol, dataType) {     
     return   function (oTR1, oTR2) {     
          var vValue1 = convert(ieOrFireFox(oTR1.cells[iCol]),

dataType);     
          var vValue2 = convert(ieOrFireFox(oTR2.cells[iCol]),

dataType);     
          if (vValue1 < vValue2) {     
              return -1;     
          } else if (vValue1 > vValue2) {     
              return 1;     
          } else {     
            return 0;     
            }     
         };     
}     
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值