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

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

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

    javaGrowing

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      92 隨筆 :: 33 文章 :: 49 評論 :: 0 Trackbacks

    Dom + Javascript 在本機瀏覽器中對的表格數據進行排序

    在本機瀏覽器中對的表格數據進行排序
    在Web應用中,數據從服務器端返回到客戶端,以表格形式表現出來。如果要對數據集按指定的列排序顯示,常規做法都是向服務器發出請求,服務器端程序重新從數據庫中取出按指定列排序的數據,返回給客戶端,頁面重新顯示排序后數據。
    ?
    采用這種方式有如下缺點:
    1- 響應時間延遲,每次排序都要向服務器端發送請求,等待結果返回,同時增加網絡負載。
    2- 編程復雜,可維護性差,而且客戶端和服務器端代碼耦合度很高,客戶端和服務器端都要處理排序涉及的列名、排序方式,如果有分頁和查詢條件,都需要在客戶端頁面中保留,排序請求時重新傳遞到服務器端,當參數數量很多時極易出錯。
    3- 重用度很低,針對不同表格,很難抽象出一個公共程序來共用,需要逐個編寫代碼實現,增加工作量。
    ?
    現在換一個角度考慮,數據既然已下載到了客戶端,在重新排序時沒有必要再重服務器端獲取,只要對瀏覽器中的數據重新排序顯示就可以了。要實現該目標,需要做到以下幾點:
    1 - 獲得表格中要排序的數據,將其放入一個2維數組中。
    2 - 對2維數組排序。
    3 - 用排序后的數據重新更新表格。
    ?
    利用瀏覽器支持的DOM(Document Object Model)和JavaScript即可實現上述目標。
    ?
    通常頁面中會很多的<table>,要獲得需要排序數據所在的table,需要在<table>中增加一個id屬性,便于document對象用getElementById得到該表格對象,例如要排序的表格定義如下:
    ?<table id="st" >
    ??? <tr>
    ??????? <td>1</td>
    ??????? <td>2</td>
    ??? </tr>
    </table>
    ?
    在javascript中,用var objTable = document.getElementById("st")就可得到表格對象,該對象在DOM中定義為一個Element。
    ?
    然 后用 var objRows = objTable.getElementsByTagName("tr")得到該表格中全部的行對象,ObjRows.length返回該表格行數; var rowi = objRows[i].getElementsByTagName("td")得到第i行的全部<td>節點,i從0開始計數, rowi.item(j)則可得到第i行,第j列的節點,該節點的innerHTML為該節點<td></td>之間的內容。
    ?
    獲取表格數據到2維數組的代碼見源代碼,此處略。
    ?
    下面說明在javascript中2維數組的構造和排序。
    javascript不支持2維數組,因此需要用數組的數組來模擬一個2維數組,其方法是先定義一個1維數組,元素個數為2維數組的行數,然后對每個元素賦一個值,值為一個數組,其元素個數為2維數組的列數。構造代碼如下:
    ?
    var rows = new Array(R);? //R為行數
    for(var i = 0; i < rows.length; i++){
    ??? rows[i] = new Array(C);??? //C為列數
    }
    ?
    ?
    利用javascript中的Array.sort(comparer)對rows中的元素排序,比較方式由重新定義的比較函數得到。要根據第j列元素的大小排序,只要定義如下函數即可:
    ?
    function compareCol(a,b){
    ???
    ??? if (a[j] < b[j])
    ??????? return -1;
    ?
    ??? if (a[j] > b[j])
    ??????? return 1;
    ?
    ?? return 0;
    ?
    }
    ?
    因為compareCol只能有兩個參數,因此j要定義為全局變量。
    ?
    用rows.sort (compareCol)就可實現根據j列值的大小對行進行排序。根據javascript文檔,字符串比較大小是按照其Unicode編碼的大小來比 較,對英文排序沒有問題,對中文排序時就不是按通常的拼音排序,那需要javascript提供本地化支持,目前沒有發現javascript此功能。該 功能在java中可用java.text.Collator實現。
    ?
    ?
    ?以上介紹了在本地對瀏覽器中的數據進行排序的主要思想, 為方便使用,將這些功能進行了封裝,以javascript函數的提供,存放在sorttable.js文件中,在需要的頁面中用<script type=text/javascript src='sorttable.js'></script>引入。
    ?
    ?
    ?下面說明排序函數原型和使用方法。
    ?
    函數1 function sortTable(tableId,sortCol,compareType)
    對頁面中指定表格中的數據進行排序,通常第一行為標題行,排序時從第二行開始,第一次調用為升序排列,第二次為降序排列,依次輪換。
    tableId??? 為<table id=''>中id的值,在同一個頁面中要唯一。
    sortCol??? 排序時用來比較大小的數據所在的列,從1開始計數。
    compareType 排序時比較大小的方式,s-按字符串比較大小,n-按數字比較大小。
    ?
    ?
    ?
    ?函數2 function sortTableInRange(tableId,sortCol,compareType,startRow,endRow,startCol,endCol)
    ?
    ??????? 對表格中指定的區域數據排序,有時數據第一列為流水號,最后一行為合計,這些數據不需要參與排序,可用此函數來對部分數據排序。
    ???????
    ??????? tableId??? 為<table id=''>中id的值,在同一個頁面中要唯一。
    ??????? sortCol??? 排序時用來比較大小的數據所在的列,從1開始計數。
    ??????? compareType 排序時比較大小的方式,s-按字符串比較大小,n-按數字比較大小。
    ??????? startRow,endRow 要排序區域開始和結束行號,從1開始計數。例如對第2行到第7行排序,startRow=2,endRow=7
    ??????? startCol,endCol? 要排序區域開始和結束列號,從1開始計數。
    ?
    ?
    ?
    ?
    ?
    存在的問題:
    1- 中文不能按拼音排序。
    ?
    ?
    要注意的問題:
    要排序的table必須用ID標示,并要作為參數傳給排序函數,表格中的數據應該是可以排序的,否則結果不可預知;要排序的表格不能有嵌套表,否則排序出錯。
    ?
    ?
    本函數已在IE6.0 ,FireFox1.01中運行通過。源代碼和例子代碼見后。
    ?
    ?
    ?
    ?
    參考資料:
    ?
    Danny Goodman with Michael Morrison?? JavaScript Bible 5th? ,John Wiley and Sons? 2004
    ?
    David Flanagan? JavaScript The Definitive Guide 4th ,? O'Reilly? 2001
    ?
    ?
    ?
    ?
    ?
    ?附源代碼:要運行例子,需要將javascript代碼保存到sorttable.js文件中,html部分代碼保存到同一目錄下另一文件中即可。
    ?
    ?
    sorttable.js
    ?
    ?

    ?1?//=========================================================
    ?2??//
    ?3??//??在本機對瀏覽器頁面表格中的數據行進行排序的javascript函數
    ?4??//?
    ?5??//??author?William??QQ:?22967225
    ?6?//??create?date?2005-12-2
    ?7??//??version?1.0
    ?8??//=========================================================
    ?9?
    10??//column?index?for?sort
    11??var?indexCol;
    12??//比較函數,用于Array.sort()排序時比較用。
    13??//本函數比較數組元素array1[indexCol]和元素array2[indexCol]Unicode值的大小
    14??function?arrayCompare(array1,array2){
    15???//alert(array1.length+"--"+array1[indexCol]);
    16???if?(array1[indexCol]?<?array2[indexCol])
    17????return?-1;
    18???if?(array1[indexCol]?>?array2[indexCol])
    19????return?1;
    20??
    21???return?0;
    22??
    23??}
    24??//比較數組元素array1[indexCol]和元素array2[indexCol]的數值大小
    25??function?arrayCompareNumber(array1,array2){
    26??
    27???if?(parseInt(array1[indexCol])?<?parseInt(array2[indexCol]))
    28????return?-1;
    29???if?(parseInt(array1[indexCol])?>?parseInt(array2[indexCol]))
    30????return?1;
    31??
    32???return?0;
    33??}
    34??//與arrayCompare相反方式比較大小,用于倒序使用
    35??function?arrayCompareRev(array1,array2){
    36??
    37???if?(array1[indexCol]?<?array2[indexCol])
    38????return?1;
    39???if?(array1[indexCol]?>?array2[indexCol])
    40????return?-1;
    41??
    42???return?0;
    43??
    44??}
    45??//與arrayCompareNumber相反方式比較大小,用于倒序使用
    46??function?arrayCompareNumberRev(array1,array2){
    47???if?(parseInt(array1[indexCol])?<?parseInt(array2[indexCol]))
    48????return?1;
    49???if?(parseInt(array1[indexCol])?>?parseInt(array2[indexCol]))
    50????return?-1;
    51??
    52???return?0;
    53??}
    54??
    55??//define?a?2-dimension?array
    56??function?BiArray(rows,cols){
    57??
    58???//simulate?multidimension?array
    59???this.rows?=?rows;
    60???this.cols?=?cols;
    61??
    62???//construct?array
    63???var?lines?=?new?Array(rows);
    64???for(var?i?=?0;i?<?lines.length;?i++){
    65????lines[i]?=?new?Array(cols);
    66???}

    ?
    posted on 2007-07-23 16:20 javaGrowing 閱讀(440) 評論(0)  編輯  收藏 所屬分類: javascript
    主站蜘蛛池模板: 久久综合亚洲色HEZYO社区 | 国产亚洲3p无码一区二区| 两个人看的www高清免费观看| 亚洲日本精品一区二区| 最近中文字幕免费mv视频7| 特级毛片A级毛片100免费播放| 久久久无码精品亚洲日韩蜜桃| 青青久在线视频免费观看 | 妞干网免费视频在线观看| 成在线人视频免费视频| 国产精品久久亚洲不卡动漫| 中文字幕不卡亚洲| 天天摸天天碰成人免费视频| 两个人看的www高清免费视频| 亚洲小说图区综合在线| 久久亚洲国产欧洲精品一| 永久免费av无码网站大全| 久久中文字幕免费视频| 国产午夜亚洲精品不卡| 亚洲毛片无码专区亚洲乱| JLZZJLZZ亚洲乱熟无码| 97无码免费人妻超级碰碰碰碰| 国产无遮挡裸体免费视频在线观看 | 亚洲精品中文字幕无乱码麻豆| 久久亚洲高清综合| 成人a视频片在线观看免费| 成人无码a级毛片免费| 亚洲欧美在线x视频| ASS亚洲熟妇毛茸茸PICS| 久久亚洲精品成人777大小说| 免费在线不卡视频| 最近最好的中文字幕2019免费 | kk4kk免费视频毛片| 在线a亚洲老鸭窝天堂av高清| 亚洲VA中文字幕无码一二三区 | 97视频免费观看2区| 成在人线av无码免费高潮水| 国产成人精品亚洲| 亚洲色欲啪啪久久WWW综合网| 亚洲欧洲校园自拍都市| 亚洲国产精品无码久久一区二区|