1. 程式人生 > >javascript實現了客戶端頁面的表格排序

javascript實現了客戶端頁面的表格排序

好久沒寫博了,一直以來都太忙了:進入到後半學期後,每週要上四次課,每天都要備課,有點時間就趕工,沒時間寫。儘管如此,剛剛解決的客戶端頁面用javascript實現的表格排序,還是要記錄下來。 

需求背景:系統中的一個統計功能,速度較慢,按照之前的做法,是通過把結果表格的表頭文字做成連結,向伺服器提交排序的列名和排序方式(升序/降序),然後重新從服務端返回結果來實現的排序。但是,這種方法無疑效率很差,加重了網路通訊和伺服器的負擔。於是考慮用javascript在客戶端頁面對結果列表排序。 

說實話,這種方法以前還真沒接觸過,上網查了一下,發現其實已經不是什麼新鮮的辦法了。能找到很多,我覺得cloudgamer做得很好(

http://www.cnblogs.com/cloudgamer/archive/2008/10/06/1304414.html),實現了對包括複選框、單選框列在內的各種型別的table列排序。可惜的是,在我的專案中沒有應用成功,不知道跟在rails中使用RJS有關。後來,又找到了利用javascript中的moveRows方法,移動table中的行的方法,而且有一個現成的程式碼可用。但是發現該程式碼只是將行的順序顛倒,而不能對亂序的行真正排序。不過這個方法很有啟發性。最終,結合在網上又找到的javascript實現的排序演算法,自己最終實現了針對本專案的排序方法。 

程式碼如下: 

1、頁面呼叫的排序函式。其中sorttype=1表示降序,-1表示升序;BubbleSort為氣泡排序法。

引數:nColNum為列序號(從0開始);strDataType為所排序的資料型別,如int、float等。

2、氣泡排序函式。

引數:table為要排序的表格;nColNum為列序號(從0開始);strDataType為所排序的資料型別,如int、float等,函式中根據不同的資料型別,做相應的型別轉換,再比較。

其它:函式主要就是根據傳入的引數,對待排序表格(table)的指定列(nColNum),以某種資料型別(strDataType),按照指定排序方式(nSortOrder,升序/降序),以氣泡排序法排序。其中用類似“table.rows[j].cells[nColNum].childNodes[0].data”這樣的語句,取得table中某一行某個單元格中的資料。交換兩行時,呼叫Swap函式。本函式中對int、float型別的資料做了顯式轉換,根據具體需求,可繼續擴充。

需要注意的另外一點,是for(var i=1;i<length;i++)這層迴圈:由於表格的第一行是列名(表頭),故從i=1開始迴圈,而不是i=0。

3、交換表格行的函式。

引數:table為要交換行的表格;i、j為要交換的兩個行號。

這個函式就是充分利用了table元素的moveRow方法,實現兩行位置的交換。該方法的第一個引數是待移動的行號,第二個引數是移動目標位置的行號。這個函式移動某行後,其它行的位置會做相應調整。根據i、j大小的不同,要想達到最終交換兩行的目的,要分別做兩種不同的操作,如函式中所寫。這個過程很簡單,在紙上畫一畫就能明白了。

最後,在頁面上只要把表格可排序的列名做成連結呼叫sortByCol函式即可,如:

<th nowrap>
   <a href="#" onclick="sortByCol(0);">學科程式碼</a>
</th>

根據BubbleSort函式中的switch,不指定資料型別(即第二個引數)的話,就是預設按照字串型別排序。下面是指定了資料型別的:

<th nowrap>
    <a href="#" onclick="sortByCol(2,'float');">百分比(%)</a>
</th> 

再有就是,還可用快速排序等其它排序方法實現,相應演算法網上也很容易找到,做相應改造即可。

由於實際應用中,結果未分頁,故這三個函式也未實現對分頁資料的排序。

這個方法的一般性還未仔細考察,留待以後用在其它頁面上時再做。 

javascript很強大,還有很多可學的。