<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 阿蜜果 閱讀(1782) 評論(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.tkk7.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

    積分與排名

    • 積分 - 2294312
    • 排名 - 3

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲国产美国国产综合一区二区| 免费va人成视频网站全| 亚洲av无码专区在线播放| 免费一区二区三区在线视频| 免费精品一区二区三区在线观看| 亚洲一线产区二线产区精华| 免费不卡视频一卡二卡| 亚洲精品第一综合99久久| 免费看无码自慰一区二区| 免费看黄网站在线看 | 国产亚洲精品国看不卡| 又黄又大的激情视频在线观看免费视频社区在线 | 成人免费一区二区三区| 亚洲精品无码久久久久去q| 日本卡1卡2卡三卡免费| 亚洲电影在线播放| 18禁超污无遮挡无码免费网站国产 | 四虎在线免费视频| 亚洲一区二区观看播放| 亚洲 小说区 图片区 都市| 久久99精品免费一区二区| 亚洲AV无码乱码国产麻豆穿越| 亚洲免费闲人蜜桃| 亚洲大尺度无码无码专线一区| 亚洲国产天堂久久久久久| 免费在线中文日本| 亚洲va在线va天堂成人| 亚洲电影日韩精品| 99爱视频99爱在线观看免费| 亚洲国产无线乱码在线观看| 久久影视综合亚洲| 1000部拍拍拍18勿入免费视频软件| 亚洲精品无码久久久久APP| 久久久久亚洲av成人无码电影| 222www免费视频| 污污视频免费观看网站| 91在线亚洲精品专区| 国产无遮挡吃胸膜奶免费看视频| 黄色网站软件app在线观看免费| 亚洲 日韩经典 中文字幕| 国产亚洲精品激情都市|