日本xxxx18视频在线观看-日本xxxx1819-日本xxxwww在线观看-日本xxx-日本xx-日本www在线视频

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

Javascript 在本機(jī)瀏覽器中對(duì)的表格數(shù)據(jù)進(jìn)行排序[轉(zhuǎn)]

admin
2010年8月18日 0:58 本文熱度 4282

在Web應(yīng)用中,數(shù)據(jù)從服務(wù)器端返回到客戶端,以表格形式表現(xiàn)出來(lái)。如果要對(duì)數(shù)據(jù)集按指定的列排序顯示,常規(guī)做法都是向服務(wù)器發(fā)出請(qǐng)求,服務(wù)器端程序重新從數(shù)據(jù)庫(kù)中取出按指定列排序的數(shù)據(jù),返回給客戶端,頁(yè)面重新顯示排序后數(shù)據(jù)。


采用這種方式有如下缺點(diǎn):

1- 響應(yīng)時(shí)間延遲,每次排序都要向服務(wù)器端發(fā)送請(qǐng)求,等待結(jié)果返回,同時(shí)增加網(wǎng)絡(luò)負(fù)載。

2- 編程復(fù)雜,可維護(hù)性差,而且客戶端和服務(wù)器端代碼耦合度很高,客戶端和服務(wù)器端都要處理排序涉及的列名、排序方式,如果有分頁(yè)和查詢條件,都需要在客戶端頁(yè)面中保留,排序請(qǐng)求時(shí)重新傳遞到服務(wù)器端,當(dāng)參數(shù)數(shù)量很多時(shí)極易出錯(cuò)。

3- 重用度很低,針對(duì)不同表格,很難抽象出一個(gè)公共程序來(lái)共用,需要逐個(gè)編寫(xiě)代碼實(shí)現(xiàn),增加工作量。


現(xiàn)在換一個(gè)角度考慮,數(shù)據(jù)既然已下載到了客戶端,在重新排序時(shí)沒(méi)有必要再重服務(wù)器端獲取,只要對(duì)瀏覽器中的數(shù)據(jù)重新排序顯示就可以了。要實(shí)現(xiàn)該目標(biāo),需要做到以下幾點(diǎn):

1 - 獲得表格中要排序的數(shù)據(jù),將其放入一個(gè)2維數(shù)組中。

2 - 對(duì)2維數(shù)組排序。

3 - 用排序后的數(shù)據(jù)重新更新表格。


利用瀏覽器支持的DOM(Document Object Model)和JavaScript即可實(shí)現(xiàn)上述目標(biāo)。


通常頁(yè)面中會(huì)很多的<table>,要獲得需要排序數(shù)據(jù)所在的table,需要在<table>中增加一個(gè)id屬性,便于document對(duì)象用getElementById得到該表格對(duì)象,例如要排序的表格定義如下:

<table id="st" >

     <tr>

         <td>1</td>

         <td>2</td>

     </tr>

</table>


在javascript中,用var objTable = document.getElementById("st")就可得到表格對(duì)象,該對(duì)象在DOM中定義為一個(gè)Element。


然后用 var objRows = objTable.getElementsByTagName("tr")得到該表格中全部的行對(duì)象,ObjRows.length返回該表格行數(shù);var rowi = objRows[i].getElementsByTagName("td")得到第i行的全部<td>節(jié)點(diǎn),i從0開(kāi)始計(jì)數(shù),rowi.item(j)則可得到第i行,第j列的節(jié)點(diǎn),該節(jié)點(diǎn)的innerHTML為該節(jié)點(diǎn)<td></td>之間的內(nèi)容。


獲取表格數(shù)據(jù)到2維數(shù)組的代碼見(jiàn)源代碼,此處略。


下面說(shuō)明在javascript中2維數(shù)組的構(gòu)造和排序。

javascript不支持2維數(shù)組,因此需要用數(shù)組的數(shù)組來(lái)模擬一個(gè)2維數(shù)組,其方法是先定義一個(gè)1維數(shù)組,元素個(gè)數(shù)為2維數(shù)組的行數(shù),然后對(duì)每個(gè)元素賦一個(gè)值,值為一個(gè)數(shù)組,其元素個(gè)數(shù)為2維數(shù)組的列數(shù)。構(gòu)造代碼如下:


var rows = new Array(R);   //R為行數(shù)

for(var i = 0; i < rows.length; i++){

     rows[i] = new Array(C);     //C為列數(shù)

}



利用javascript中的Array.sort(comparer)對(duì)rows中的元素排序,比較方式由重新定義的比較函數(shù)得到。要根據(jù)第j列元素的大小排序,只要定義如下函數(shù)即可:


function compareCol(a,b){

    

     if (a[j] < b[j])

         return -1;


     if (a[j] > b[j])

         return 1;


    return 0;


}


因?yàn)閏ompareCol只能有兩個(gè)參數(shù),因此j要定義為全局變量。


用rows.sort(compareCol)就可實(shí)現(xiàn)根據(jù)j列值的大小對(duì)行進(jìn)行排序。根據(jù)javascript文檔,字符串比較大小是按照其Unicode編碼的大小來(lái)比較,對(duì)英文排序沒(méi)有問(wèn)題,對(duì)中文排序時(shí)就不是按通常的拼音排序,那需要javascript提供本地化支持,目前沒(méi)有發(fā)現(xiàn)javascript此功能。該功能在java中可用java.text.Collator實(shí)現(xiàn)。



以上介紹了在本地對(duì)瀏覽器中的數(shù)據(jù)進(jìn)行排序的主要思想,為方便使用,將這些功能進(jìn)行了封裝,以javascript函數(shù)的提供,存放在sorttable.js文件中,在需要的頁(yè)面中用<script type=text/javascript src='sorttable.js'></script>引入。



下面說(shuō)明排序函數(shù)原型和使用方法。


函數(shù)1 function sortTable(tableId,sortCol,compareType)


對(duì)頁(yè)面中指定表格中的數(shù)據(jù)進(jìn)行排序,通常第一行為標(biāo)題行,排序時(shí)從第二行開(kāi)始,第一次調(diào)用為升序排列,第二次為降序排列,依次輪換。

tableId     為<table id=''>中id的值,在同一個(gè)頁(yè)面中要唯一。

sortCol     排序時(shí)用來(lái)比較大小的數(shù)據(jù)所在的列,從1開(kāi)始計(jì)數(shù)。

compareType 排序時(shí)比較大小的方式,s-按字符串比較大小,n-按數(shù)字比較大小。




函數(shù)2 function sortTableInRange(tableId,sortCol,compareType,startRow,endRow,startCol,endCol)


         對(duì)表格中指定的區(qū)域數(shù)據(jù)排序,有時(shí)數(shù)據(jù)第一列為流水號(hào),最后一行為合計(jì),這些數(shù)據(jù)不需要參與排序,可用此函數(shù)來(lái)對(duì)部分?jǐn)?shù)據(jù)排序。

        
         tableId     為<table id=''>中id的值,在同一個(gè)頁(yè)面中要唯一。

         sortCol     排序時(shí)用來(lái)比較大小的數(shù)據(jù)所在的列,從1開(kāi)始計(jì)數(shù)。

         compareType 排序時(shí)比較大小的方式,s-按字符串比較大小,n-按數(shù)字比較大小。

         startRow,endRow 要排序區(qū)域開(kāi)始和結(jié)束行號(hào),從1開(kāi)始計(jì)數(shù)。例如對(duì)第2行到第7行排序,startRow=2,endRow=7

         startCol,endCol   要排序區(qū)域開(kāi)始和結(jié)束列號(hào),從1開(kāi)始計(jì)數(shù)。





  

存在的問(wèn)題:

1- 中文不能按拼音排序。



要注意的問(wèn)題:

要排序的table必須用ID標(biāo)示,并要作為參數(shù)傳給排序函數(shù),表格中的數(shù)據(jù)應(yīng)該是可以排序的,否則結(jié)果不可預(yù)知;要排序的表格不能有嵌套表,否則排序出錯(cuò)。



本函數(shù)已在IE6.0 ,FireFox1.01中運(yùn)行通過(guò)。源代碼和例子代碼見(jiàn)后。





參考資料:


Danny Goodman with Michael Morrison    JavaScript Bible 5th   ,John Wiley and Sons   2004


David Flanagan   JavaScript The Definitive Guide 4th ,   O'Reilly   2001






附源代碼:要運(yùn)行例子,需要將javascript代碼保存到sorttable.js文件中,html部分代碼保存到同一目錄下另一文件中即可。



sorttable.js


//=========================================================
//
//   在本機(jī)對(duì)瀏覽器頁(yè)面表格中的數(shù)據(jù)行進(jìn)行排序的javascript函數(shù)
//  
//   author William   QQ: 22967225

//   create date 2005-12-2
//   version 1.0
//=========================================================


//column index for sort
var indexCol;

//比較函數(shù),用于Array.sort()排序時(shí)比較用。
//本函數(shù)比較數(shù)組元素array1[indexCol]和元素array2[indexCol]Unicode值的大小
function arrayCompare(array1,array2){
   //alert(array1.length+"--"+array1[indexCol]);
   if (array1[indexCol] < array2[indexCol])
    return -1;
   if (array1[indexCol] > array2[indexCol])
    return 1;
  
   return 0;

}

//比較數(shù)組元素array1[indexCol]和元素array2[indexCol]的數(shù)值大小
function arrayCompareNumber(array1,array2){
  
   if (parseInt(array1[indexCol]) < parseInt(array2[indexCol]))
    return -1;
   if (parseInt(array1[indexCol]) > parseInt(array2[indexCol]))
    return 1;
  
   return 0;

}


//與arrayCompare相反方式比較大小,用于倒序使用
function arrayCompareRev(array1,array2){
  
   if (array1[indexCol] < array2[indexCol])
    return 1;
   if (array1[indexCol] > array2[indexCol])
    return -1;
  
   return 0;

}

//與arrayCompareNumber相反方式比較大小,用于倒序使用
function arrayCompareNumberRev(array1,array2){
   if (parseInt(array1[indexCol]) < parseInt(array2[indexCol]))
    return 1;
   if (parseInt(array1[indexCol]) > parseInt(array2[indexCol]))
    return -1;
  
   return 0;

}


//define a 2-dimension array
function BiArray(rows,cols){
  
   //simulate multidimension array
   this.rows = rows;
   this.cols = cols;
  
   //construct array
   var lines = new Array(rows);

   for(var i = 0;i < lines.length; i++){
    lines[i] = new Array(cols);
   }
  
  
   // 設(shè)置數(shù)組在(i,j)的元素值為value
   this.setElement = function(i,j,value){ lines[i][j] = value; };
  
   // 獲取數(shù)組在(i,j)處元素的值
   this.getElement = function(i,j){return lines[i][j];};
  
   // 返回?cái)?shù)組第i行所在的數(shù)組
   this.getLine = function(i){return lines[i];};

  
   // 根據(jù)第j列字符串的值,對(duì)數(shù)組的行進(jìn)行排序,排序結(jié)果為升序
   this.sortLine = function(j){
        indexCol = j;
        lines.sort(arrayCompare);
       };
  
   // 根據(jù)第j列數(shù)值的值,對(duì)數(shù)組的行進(jìn)行排序,排序結(jié)果為升序
   this.sortLineByNumber = function(j){
        indexCol = j;
        lines.sort(arrayCompareNumber);
       };

  
   // 根據(jù)第j列字符串的值,對(duì)數(shù)組的行進(jìn)行排序,排序結(jié)果為倒序
   this.sortLineRev = function(j){
        indexCol = j;
        lines.sort(arrayCompareRev);
       };
  
   // 根據(jù)第j列數(shù)值的值,對(duì)數(shù)組的行進(jìn)行排序,排序結(jié)果為倒序
   this.sortLineByNumberRev = function(j){
        indexCol = j;
        lines.sort(arrayCompareNumberRev);

       };

   //將二維數(shù)組轉(zhuǎn)為字符串格式
   this.toString = function(){
        var rst ="";
        for(var i = 0; i < lines.length; i++){
         for(var j = 0; j < lines[i].length; j++){
          rst += lines[i][j];
          rst += '\t';
         }
         rst += '\n';
        }

        return rst;
       };

} // end of BiArray define

//ascending or descending
var asce = true;


/**
   對(duì)表格中指定范圍的數(shù)據(jù)進(jìn)行排序
   tableId     要排序的表格的id,值格式為 <table id="tb1" >
   sortCol     用于排序的列號(hào),從1開(kāi)始計(jì)數(shù)
   compareType    排序時(shí)比較方式,s-按字符串比較,n-按數(shù)值比較
   startRow    排序范圍起始行號(hào),從1開(kāi)始計(jì)數(shù)
   endRow      排序范圍結(jié)束行號(hào),從1開(kāi)始計(jì)數(shù)
   startCol    排序范圍起始列號(hào),從1開(kāi)始計(jì)數(shù)
   endCol      排序范圍結(jié)束列號(hào),從1開(kāi)始計(jì)數(shù)

*/
function sortTableInRange(tableId,sortCol,compareType,startRow,endRow,startCol,endCol){
  
  
   try{
    var table = document.getElementById(tableId);
    // get all row object of the table
    var objRows = table.getElementsByTagName("tr");
    //alert(objRows.length);
   
    endRow = (endRow < objRows.length ? endRow : objRows.length);
   
    var sortRows = endRow - startRow + 1;
    //alert("sortRows "+sortRows);
    if (sortRows < 2) //only one line,don't sort
     return ;
   
   
    endCol = (endCol < objRows[1].getElementsByTagName("td").length ? endCol :
      objRows[1].getElementsByTagName("td").length);
   
   
    // column number of sort
    //var cols = objRows[1].childNodes.length;
    var cols = endCol - startCol + 1;
    
   
    
    // define a array to store table cell and sort them
    var tabData = new BiArray(sortRows,cols);
   
   
    var ari = 0;
    // retrived table cell data save to array
    for(i = startRow - 1; i < endRow; i++){
     //retrived all <td> cell
     var cells = objRows[i].getElementsByTagName("td");
    
     var arj = 0;
     for(var j = startCol - 1; j < endCol; j++){
      tabData.setElement(ari,arj,cells.item(j).innerHTML);
      arj++;
     
     }
     ari++;

    }
   
    if (asce){
     if (compareType == "n" || compareType == 'N')
      tabData.sortLineByNumber(sortCol- startCol);
     else
      tabData.sortLine(sortCol - startCol);

     asce = false;
    }else{
     if (compareType == "n" || compareType == 'N')
      tabData.sortLineByNumberRev(sortCol - startCol);
     else
      tabData.sortLineRev(sortCol - startCol);
     asce = true;
    }

    ari = 0;
    //update table data with array
    for(i = startRow -1; i < endRow; i++){
     //retrived all <td> cell
     var cells = objRows[i].getElementsByTagName("td");
    
     arj = 0;
     for(var j = startCol - 1; j < endCol; j++){
      cells.item(j).innerHTML = tabData.getElement(ari,arj);
      arj++;
     }
     ari++;
    }


   }catch(e){
    alert(e);
   }
}


/**
   對(duì)表格除第一行外的數(shù)據(jù)行排序,是sortYableInRange(tableId,sortCol,compareType,2,tabRows,1,tabCols)
   的特例。
   tableId     要排序的表格的id,值格式為 <table id="tb1" >
   用于排序的列號(hào),從1開(kāi)始計(jì)數(shù)
   compareType    排序時(shí)比較方式,s-按字符串比較,n-按數(shù)值比較

*/
function sortTable(tableId,sortCol,compareType){
  
  
   try{
    var table = document.getElementById(tableId);
    // get all row object of the table
    var objRows = table.getElementsByTagName("tr");
    //alert(objRows.length);
   
   
    var endRows = objRows.length;
   
    if (endRows < 2) //only one line,don't sort
     return ;
   
    // column number of table
    var cols = objRows[1].getElementsByTagName("td").length;
   
   
    sortTableInRange(tableId,sortCol,compareType,2,endRows,1,cols);
   

   }catch(e){
    alert(e);
   }
}

==========javascript 代碼結(jié)束============


例子HTML頁(yè)面代碼


<html>
<head content="text/html; charset=gb2312" >
<script type="text/javascript" src="sorttable.js">
</script>
</head>
<body>
   常規(guī)排序例子<br>
   <table id="t1" border="1">
    <tr>
     <td width="20%"><a href="#" onclick="sortTable('t1',1,'s')" >城市</a></td>
     <td width="30%"><a href="#" onclick="sortTable('t1',2,'s')" >品牌</a></td>
     <td width="30%"><a href="#" onclick="sortTable('t1',3,'n')" >銷量</a></td>
    </tr>
    <tr>
    
     <td><a href="#" >北京</a></td>
     <td>GOOGLE</td>
     <td>64</td>
    </tr>
    <tr>
     <td>上海</td>
     <td>CISCO</td>
     <td>54</td>
    </tr>

    <tr>
     <td>廣州</td>
     <td>MS</td>
     <td>9</td>
    </tr>

    <tr>
    
     <td>南京</td>
     <td>INTEL</td>
     <td>120</td>
    </tr>

   </table>



   <br>對(duì)部分?jǐn)?shù)據(jù)排序例子(對(duì)第2-5行,第2-4列區(qū)域排序)<br>
   <table id="t2" border="1">
    <tr>
     <td>序號(hào)</td>
     <td width="20%"><a href="#" onclick="sortTableInRange('t2',2,'s',2,5,2,4)" >城市</a></td>
     <td width="30%"><a href="#" onclick="sortTableInRange('t2',3,'s',2,5,2,4)" >品牌</a></td>
     <td width="30%"><a href="#" onclick="sortTableInRange('t2',4,'n',2,5,2,4)" >銷量</a></td>
    </tr>
    <tr>
     <td>1</td>
     <td><a href="#" >北京</a></td>
     <td>GOOGLE</td>
     <td>64</td>
    </tr>
    <tr>
     <td>2</td>
     <td>上海</td>
     <td>CISCO</td>
     <td>54</td>
    </tr>
    <tr>
     <td>3</td>
     <td>廣州</td>
     <td>MS</td>
     <td>9</td>
    </tr>
    <tr>
     <td>4</td>
     <td>南京</td>
     <td>INTEL</td>
     <td>120</td>
    </tr>
   </table>
</body>
</html>

該文章在 2010/8/18 0:58:43 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 日本一本草久国产欧美日韩 | 欧美日韩国产视频 | 国产欧美日产视频 | 亚洲一区日韩高清中文字幕 | 久这里只有精品国产66热99 | 精品国产日韩一区2区3区 | 91人成亚洲高清 | 欧美毛多| 欧美视频在线视频精品 | 国产三香港三韩国三级不卡 | 国产精品人视频人人视频 | 国产精品对白刺激音频在线观看 | 18欧美?日韩?国产?中文 | 精品一区二区三区四区五区六区 | 国产亚洲一卡二卡三卡四卡 | 国产欧美视频日韩 | 国产日韩欧美在线一区 | 免费b站在线观看人数在哪儿找 | 精品国产中文乱伦 | 91小视频在线观看 | 欧美剧国产剧视频在线观看 | 国产日韩欧美亚洲视频观看 | igao视频网 | 国产福利91精品一区二区 | 国产一级中文字幕 | 99热6| 国产乱码亚洲日韩欧美乱码 | 国产一区二区三区精品 | 国产二三 | 国产一级a在线观看免费 | 男女一进一出超猛烈的视频 | 国产自产一区二区三区视频在 | 国产日韩欧美一区二区三区欧 | 国产精品区一区二区三在线播放 | 不打码成人影片免 | 日韩一区二区三区在线观看 | 日韩丝袜中文字幕在线观看 | 欧美在线激情视频 | 92国产精品 | 巨胸喷奶 | 日韩福利在线视频 |