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

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

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

    零全零美(www.zzgwt.com)
    生活中的很多事情,并不像If...Else那么簡(jiǎn)單!
    posts - 96,comments - 52,trackbacks - 0
       本文所實(shí)現(xiàn)的表格排序大致可以分為以下幾個(gè)步驟:
        1、取得要排序的所有行,將其引用push到一個(gè)數(shù)組中
        2、根據(jù)要排序的行的情況編寫數(shù)組排序時(shí)使用的比較函數(shù)
        3、對(duì)包含所有行引用的數(shù)組進(jìn)行排序
        4、將排序后的數(shù)組按照指定的順序把數(shù)組所引用的行重新寫回DOM

       如果您對(duì)使用DOM操作表格還不太熟悉,您可以參考一下《使用DOM編寫瀏覽器兼容的Table操作》,如果您對(duì)數(shù)組的排序還不太熟悉,可以參考一下《數(shù)組排序以及在漢字排序中l(wèi)ocaleCompare()方法的使用》,因?yàn)槭褂肈OM操作表格和數(shù)組排序是表格排序的基礎(chǔ)。
       先看一下我們示例用的代碼,本文會(huì)按照上面提到的步驟一步一步的分析:
     1             var asc = true;  
     2             var arrayTr = [];    //存放所有要排序的行引用的容器
     3         function sortTable(){
     4             //取得所有要排序的行
     5             var oTable = document.getElementById("oTable");
     6             var oTBody = oTable.tBodies[0];
     7             var allTr = oTBody.rows;
     8             //將要排序的行放入數(shù)組以排序
     9             for(var i=0;i<allTr.length;i++){
    10                 arrayTr.push(allTr[i]);   
    11             }
    12             //如果是升序
    13             if(asc){
    14                 arrayTr.sort(compareFunc);
    15                 oTable.rows[0].title = "點(diǎn)擊降序排列表格";
    16                 asc = false;
    17             } else {
    18                 //如果是降序
    19                 arrayTr.reverse();
    20                 oTable.rows[0].title = "點(diǎn)擊升序排列表格";
    21                 asc = true;
    22             }
    23             //將排過(guò)續(xù)的行按照數(shù)序重寫回DOM
    24             var oFragment = document.createDocumentFragment();
    25             for(var j =0; j < arrayTr.length;j++){
    26                 oFragment.appendChild(arrayTr[j]);
    27             }
    28             oTBody.appendChild(oFragment);            
    29         }
       程序的5--11行實(shí)現(xiàn)了我們所說(shuō)的第一步,這里有兩個(gè)需要說(shuō)明的地方,一是我們?cè)贖TML中使用了<thead/>和<tbody />標(biāo)簽用于分割表格的標(biāo)題本分以及要排序的部分,礙于篇幅HTML代碼不再展示,二是《JavaScript高級(jí)程序設(shè)計(jì)》說(shuō)Table的 tBodies屬性是一個(gè)JS中的集合,而不是數(shù)組,沒(méi)有sort()方法,所以不能用來(lái)直接排序,關(guān)于JS集合的概念還需要我們好好研究啊,不過(guò)這不是本文的重點(diǎn),這里我們想說(shuō)明的重點(diǎn)是,tBodies不能拿來(lái)直接排序。
       程序的13--22行實(shí)現(xiàn)了第三步,這里我們隱藏了第二步的具體實(shí)現(xiàn)(在后面的部分會(huì)詳細(xì)說(shuō)明)我們認(rèn)為這樣可以更好的說(shuō)明我們的思路,而不會(huì)讓自己糾纏于具體的方法實(shí)現(xiàn)導(dǎo)致對(duì)程序沒(méi)有一個(gè)總體的認(rèn)識(shí)。還要說(shuō)明的是程序中我們使用了一個(gè)全局性的容器來(lái)裝載排序行,所以函數(shù)執(zhí)行后,arrayTr總會(huì)包含最后一次排序的行引用順序,這時(shí)如果我們想進(jìn)行倒序的話只需調(diào)用reverse()方法,而不再需要對(duì)數(shù)組進(jìn)行逆向排序。
       程序的24行使用了document.createDocumentFragment()可以得到一個(gè)文檔碎片,documentFragment是一個(gè)不完整的document對(duì)象,主要用于存放暫時(shí)沒(méi)有加入dom樹(shù)的Element。作為js操作dom的緩存,十分好用,他會(huì)一次性的將改動(dòng)在DOM中呈現(xiàn),而不是每次操作DOM都要是客戶端重繪。
       下面看用于實(shí)現(xiàn)我們第二步的函數(shù)的具體實(shí)現(xiàn):
     1         /**
     2          * 比較函數(shù)
     3          * @param {Object} param1 要比較的行1
     4          * @param {Object} param2 要比較的行2
     5          * @return {Number} 如果param1 > param2 返回 1
     6          *                     如果param1 == param2 返回 0
     7          *                     如果param1 < param2 返回 -1
     8          */
     9         function compareFunc(oTr1,oTr2){
    10             var param1 = oTr1.cells[0].childNodes[0].nodeValue;
    11             var param2 = oTr2.cells[0].childNodes[0].nodeValue;
    12             //如果兩個(gè)參數(shù)均為字符串類型
    13             if(isNaN(param1) && isNaN(param2)){
    14                 return param1.localeCompare(param2);
    15             }
    16             //如果參數(shù)1為數(shù)字,參數(shù)2為字符串
    17             if(!isNaN(param1) && isNaN(param2)){
    18                 return -1;
    19             }
    20             //如果參數(shù)1為字符串,參數(shù)2為數(shù)字
    21             if(isNaN(param1) && !isNaN(param2)){
    22                 return 1;
    23             }
    24             //如果兩個(gè)參數(shù)均為數(shù)字
    25             if(!isNaN(param1) && !isNaN(param2)){
    26                 if(Number(param1) > Number(param2)) return 1;
    27                 if(Number(param1) == Number(param2)) return 0;
    28                 if(Number(param1) < Number(param2)) return -1;
    29             }
    30         }
       對(duì)于上述代碼的具體解釋,請(qǐng)參考《數(shù)組排序以及在漢字排序中l(wèi)ocaleCompare()方法的使用》,因?yàn)槲覀冎辉?0行、11行改變了取數(shù)據(jù)的方式而已。
       以上我們說(shuō)明了單列表格的排序思路及方法,有了這些思路我們可以很容易的擴(kuò)展我們的程序,實(shí)現(xiàn)具有更多功能的表格排序。
    posted on 2008-07-21 17:00 零全零美 閱讀(1573) 評(píng)論(0)  編輯  收藏 所屬分類: JavaScript
    主站蜘蛛池模板: 国产亚洲精品成人久久网站| 久久久久久亚洲AV无码专区| 亚洲最大av资源站无码av网址| 久久久久久久99精品免费| 亚洲AV无码一区二区乱子伦| 成人免费无码H在线观看不卡| 久久久久亚洲av毛片大| yellow免费网站| 国产亚洲精品精品国产亚洲综合| 国产区在线免费观看| 中文字幕第一页亚洲| 日韩a级无码免费视频| 亚洲AV日韩精品久久久久久| 99久久综合精品免费| 亚洲嫩草影院在线观看| 亚洲精品免费网站| 国产成人精品亚洲2020| 国产青草视频免费观看97| 男女作爱免费网站| 亚洲色成人网站WWW永久| 久久国产乱子伦精品免费不卡| 亚洲福利视频一区| 成人免费一级毛片在线播放视频| 久久精品国产亚洲av麻豆蜜芽| 日韩欧美一区二区三区免费观看| 亚洲AV无码专区在线观看成人 | 美女黄网站人色视频免费国产 | 免费人成视频x8x8入口| 免费一区二区三区在线视频| 亚洲精品午夜无码电影网| 久久精品乱子伦免费| 亚洲人成电影网站| 亚洲成A人片在线观看中文| 久久香蕉国产线看免费| 国产亚洲sss在线播放| 国产精品亚洲精品日韩已方| 99re在线视频免费观看| 亚洲中文字幕一区精品自拍| 亚洲日韩国产成网在线观看| 中文字幕视频免费| 三级片免费观看久久|