posts - 297,  comments - 1618,  trackbacks - 0
            說明:本文為《JavaScript高級程序設計》第12章“表格排序”學習筆記。

          一.起點——數組

           首先介紹一下Array對象的sort()方法,見下例所示:

           var arr = [3, 32, 2, 5];

           arr.sort();

           alert(arr.toString()); //輸出23325

           sort()方法還可以接受一個參數,即比較函數,來告訴比較算法值與值之間是大小、小于還是等于關系。代碼如下所示:

           function compareIntegers(vNum1, vNum2) {
              
          var iNum1 = parseInt(vNum1);
              
          var iNum2 = parseInt(vNum2);
              
          if (iNum1 < iNum2) {
                 
          return -1;
          }
           else if (iNum1 > iNum2) {
                 
          return 1;
          }
           else {
                 
          return 0;
          }

          }

           如果把這個比較函數應用到前面的例子中,將返回正確的結果:

           var arr = [3, 32, 2, 5];

           arr.sort(compareIntegers);

           alert(arr.toString()); //輸出23532

           reverse()方法可將數組中元素的順序倒轉。在上面代碼后使用一下reverse()方法,例:

           arr.reverse()p;

           alert(arr.toString()); //輸出32532

          二. 對表格進行排序

           下面來看一段表格的代碼:

            <table border=”1” id=”tblSort”>
                 
          <thead>
                        
          <tr>
                               
          <th>昵稱</th>
                        
          </tr>
                 
          </thead>
                 
          <tbody>
                        
          <tr>
                               
          <td>阿蜜果</td>
                        
          </tr>
                        
          <tr>
                               
          <td>娟子</td>
                        
          </tr>
                        
          <tr>
                               
          <td>sterning</td>
                        
          </tr>
                 
          </tbody>
          <table>

          1.       比較函數localeCompare()

          使用localeCompare()函數來對<tr/>元素進行排序。見下例:

          function compare(otr1, otr2) {
                  
          var sValue1 = otr1.cells[0].firstChild.nodeValue;
                  
          var sValue2 = otr2.cells[0].firstChild.nodeValue;
                  
          return sValue1.localeCompare(sValue2);
          }

          2.       sortTable()函數

          function sortTable(sTableID) {
                  
          var oTable = document.getElementById(sTableID);
                  
          var oTBody = oTable.tBodies[0];
                  
          var colDataRows = oTBody.rows;
                  
          var aTRs = new Array;
                  
          for (var i=0; i< colDataRows.length; i++{
                 aTRs[i] 
          = colDataRows[i];
          }


          aTRs.sort(compareTRs);
          var oFragment = document.createDocumentFragment();
          for (var i=0; i<aTRs.length; i++{
                 oFragment.appendChild(aTRs[i]);
          }

          oTBody.appendChild(oFragment);
          }

          調用舉例如下:

          <table border=”1” id=”tblSort”>
                 
          <thead>
                        
          <tr>
                               
          <th onclick=”sortTable(‘tblSort’)” style=”cursor:pointer”>昵稱</th>
                        
          </tr>
                 
          </thead>
                 
          <tbody>
                        
          <!—data rows-->
                 
          </tbody>
          </table>

          三.對多列表格進行排序

           在第二節中的例子中多增加一列,讓我們來看看怎么進行排序。

          1.       比較函數生成器

          function generateCompareTRs(iCol) {
                 
          return function compareTRs(otr1, otr2) {
                        
          var sValue1 = otr1.cells[0].firstChild.nodeValue;
                         
          var sValue2 = otr2.cells[0].firstChild.nodeValue;
                         
          return sValue1.localeCompare(sValue2);
          }

          }

          調用方法舉例:

          var compareTRs = generateCompareTRs(0);

          var compareTRs1 = generateCompareTRs(1);

          var compareTRs2 = generateCompareTRs(2);

          2.       修改sortTable()方法

          因為要接受另一個要排序的索引的參數,所以需要將這個索引值傳遞給generateCompareTRs()函數,修改后的sortTable()方法如下:

          function sortTable(sTableID, iCol) {
                  
          var oTable = document.getElementById(sTableID);
                  
          var oTBody = oTable.tBodies[0];
                  
          var colDataRows = oTBody.rows;
                  
          var aTRs = new Array;
                  
          for (var i=0; i< colDataRows.length; i++{
                 aTRs[i] 
          = colDataRows[i];
          }

          aTRs.sort(generateCompareTRs(iCol));
          var oFragment = document.createDocumentFragment();
          for (var i=0; i<aTRs.length; i++{
                 oFragment.appendChild(aTRs[i]);
          }

          oTBody.appendChild(oFragment);
          }

          3.       逆序排列

          要實現逆序排列,需修改sortTable()函數為如下內容:

          function sortTable(sTableID, iCol) {
                  
          var oTable = document.getElementById(sTableID);
                  
          var oTBody = oTable.tBodies[0];
                  
          var cold   ataRows = oTBody.rows;
                  
          var aTRs = new Array;
                  
          for (var i=0; i< colDataRows.length; i++{
                 aTRs[i] 
          = colDataRows[i];
          }


          if (oTable.sortCol == iCol) {
                 aTRs.reverse();
          }
           else {
          aTRs.sort(generateCompareTRs(iCol));
          }


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

          oTBody.appendChild(oFragment);
          oTable.sotCol 
          = iCol;
          }

          4.       對不同的數據類型進行排序

          1)創建轉換函數

          前面的例子只是對字符串進行排序,當然,還有很多其他的情況,首先讓我們創建一個轉換函數,代碼如下:

          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();
          }

          }

          2)修改代碼

           首先修改generateCompareTRs()方法為如下內容:

          function generateCompareTRs(iCol, sDataType) {
              
          return function compare(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;
          }

          }


          }

          同時修改sortTable()為如下內容:

          function sortTable(sTableID, iCol, sDataType) {
          var oTable = document.getElementById(sTableID);
                  
          var oTBody = oTable.tBodies[0];
                  
          var cold   ataRows = oTBody.rows;
                  
          var aTRs = new Array;
                  
          for (var i=0; i< colDataRows.length; i++{
                 aTRs[i] 
          = colDataRows[i];
          }

          aTRs.sort(generateCompareTRs(iCol, sDataType));
          var oFragment = document.createDocumentFragment();
          for (var i=0; i<aTRs.length; i++{
                 oFragment.appendChild(aTRs[i]);
          }

          oTBody.appendChild(oFragment);
          oTable.sotCol 
          = iCol;
          }

          5.       高級排序

          很少有表格只包含普通的數據類型,常常會包含鏈接、圖像或某種HTML內容,在這種情況下若需要對其進行排序,則還需要修改相關代碼才能實現,下面來看一段表格內容:

          <table border=”1” id=”tblSort”?
                  
          <thead>
                         
          <tr>
                                
          <th>類型</th>
                                
          <th>文件名</th>
                         
          </tr>
                  
          </thead>
                  
          <tbody>
                         
          <tr>
                                
          <td value=”doc”><image src=”images/wordicon.gif” /></td>
                                
          <td>簡歷.doc</td>
                         
          </tr>
                         …
                  
          </tbody>
          </table>

          在此種情況下還需修改generateCompareTRs()方法,修改后的代碼如下

          function generateCompareTRs(iCol, sDataType) {
                     
          return function compare(otr1, otr2) {
                            
          var vValue1, vValue2;
                            
          if (oTR1.cells[iCol].getAttribute(“value”)) {
                               vValue1 
          = convert(otr1.cells[iCol].getAttribute(“value”), sDataType);
                               vValue2 
          = convert(otr2.cells[iCol].getAttribute(“value”), sDataType);
          }
           else {
                               vValue1 
          = convert(otr1.cells[iCol].firstChild.nodeValue, sDataType);
                               vValue2 
          = convert(otr2.cells[iCol].firstChild.nodeValue, sDataType);
          }

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

          }

          }

           

                        

          posted on 2007-08-20 23:12 阿蜜果 閱讀(1788) 評論(7)  編輯  收藏 所屬分類: Javascript


          FeedBack:
          # re: JavaScript學習筆記——表格排序
          2007-08-21 19:30 | JAVA-HE
          我覺得那書上的表格排序不好。當時書上給的某個方法,我就發現有些問題。
          好像是: document.createDocumentFragment();
          不知道你試過沒有。不過我倒真有兼容性非常好的代碼。改天分享出來。當時找到了一個不錯的,后來發現如果要兼容IE5 還是不那么順利,后來終于發現一個好的。  回復  更多評論
            
          # re: JavaScript學習筆記——表格排序[未登錄]
          2007-08-21 21:14 | 阿蜜果
          @JAVA-HE
          拿出來啊
          給咱們學習一下
          嘻嘻  回復  更多評論
            
          # re: JavaScript學習筆記——表格排序
          2007-08-23 14:08 | mortal
          假如點擊第一次進行正向排序,
          請問怎樣實現點擊第二次的時候進行反向排序?  回復  更多評論
            
          # re: JavaScript學習筆記——表格排序
          2007-08-23 22:35 | 阿蜜果
          @mortal
          3. 逆序排列中那段代碼可以實現你想要的功能的。  回復  更多評論
            
          # re: JavaScript學習筆記——表格排序
          2007-08-23 23:48 | -274°C
          我共享一個非常好用的表格排序組件,呵呵。
          http://www.aygfsteel.com/Files/JAVA-HE/tablesort.zip
            回復  更多評論
            
          # re: JavaScript學習筆記——表格排序
          2007-08-24 00:07 | 阿蜜果
          @-274°C
          謝謝分享  回復  更多評論
            
          # re: JavaScript學習筆記——表格排序[未登錄]
          2007-10-08 11:34 | abc
          To:mortal
          在sortTable方法里加點東西就可以實現點擊第二次的時候進行反向排序
          function sortTable(sTableID){
          var oTable=document.getElementById(sTableID);
          var sortBy;
          if(oTable.getAttribute("sortBy")==null){
          oTable.setAttribute("sortBy","Asc");
          }else if(oTable.getAttribute("sortBy")=="Asc"){
          oTable.setAttribute("sortBy","Desc");
          sortBy="Desc";
          }else if(oTable.getAttribute("sortBy")=="Desc"){
          oTable.setAttribute("sortBy","Asc");
          }
          var oTBody=oTable.tBodies[0];
          var colDataRows=oTBody.rows;
          var aTRs=new Array;

          for(var i=0;i<colDataRows.length;i++){
          aTRs[i]=colDataRows[i];
          }

          aTRs.sort(compareTRs);
          if(sortBy=="Desc"){
          aTRs.reverse();
          }

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

          oTBody.appendChild(oFragment);
          }
            回復  更多評論
            
          <2007年8月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

                生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
                我的作品:
                玩轉Axure RP  (2015年12月出版)
                

                Power Designer系統分析與建模實戰  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊

          關注blog

          積分與排名

          • 積分 - 2298232
          • 排名 - 3

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 淮北市| 保定市| 五家渠市| 西畴县| 扶沟县| 南靖县| 交城县| 建宁县| 六盘水市| 布尔津县| 阿巴嘎旗| 曲沃县| 廊坊市| 河曲县| 永吉县| 休宁县| 介休市| 澎湖县| 牟定县| 德兴市| 林西县| 白银市| 隆子县| 泽普县| 宾阳县| 平潭县| 乌苏市| 遂川县| 五台县| 登封市| 太原市| 巩义市| 若尔盖县| 灵川县| 临西县| 嘉善县| 旺苍县| 清流县| 怀远县| 黄浦区| 鄂托克旗|