網上也有很多鎖定行列的方法,一個是使用css,另一個就是專門的控件附帶有鎖定的功能。css的大多數鎖定行,而不能鎖定列。好像看過園子裡的司徒正美,寫過一個用css鎖定行列的,當時css比較爛看不懂,也沒有儲存那個網址(很後悔),現在想要找卻又找不到了。
另一個就是第三方控件,這種控件很強大,鎖定行列隻是附帶的一個小功能。但是有一個比較明顯的缺點,必須使用它的控件,我想鎖定GridView,那就不行了。除非你能把他的鎖定方法給研究出來。
最近我在學jQuery,我覺得找個需求來學習,進步會比較快,于是就選擇了鎖定行列的這個需求。
目的:
1、針對<table>來鎖定,隻要是table标簽的形式都能鎖定。支援GridView等控件。
2、可以鎖定行、鎖定列、同時鎖定行列、鎖定多行多列。
3、使用簡單,無需修改背景代碼(後置代碼)。隻需要在前台稍微做點調整即可。
4、效率不能太差,最好支援多種浏覽器。
目的确定下來,然後就要想辦法實作了。其實以前也做過兩個版本,因為以前js很爛,也不知道有jQuery這樣的東東,于是就想了一個笨法。先做一個div(divMain),把要鎖定的table放進去,再做三個div,然後把要鎖定的table拷貝到三個div裡面,然後調整div的寬度、高度和位置,分别放在要鎖定的行、列和行列交叉的地方放。然後在寫一個滾動事件,在divMain的滾動條滾動的事件裡,同時滾動上面的div和左面的div。這樣就形成了一個鎖定的效果。
這個方法的缺點很多了,但是水準很爛,也隻能這樣了。現在想要提高一下js水準,那麼就要弄個更好一點的。把整個table都拷貝過去是不是太浪費了?能不能隻拷貝要鎖定的行、列?
于是呢,就要jQuery動态建立div和需要的table,然後調整他們的寬度、高度和位置,這樣在滾動的時候效率就高了很多,不過也有個問題,那就是精确擷取、設定td的高度和寬度,要能夠支援被撐高的td。這個問題困擾了我好久,昨天在群裡得到了各位高手的幫忙,尤其是“紫風鈴”的指點,才得以突破。
說了這麼多,可能大家都煩了,說一下使用方法。
1、引用jquery-1.4.2.js
3、在要鎖定的table外面加上一個div,并且設定id
4、調用js函數,myScroll('div_Main',1,1,'tableID')
第一個參數:要鎖定的table外面的div的ID,
第二個參數:要鎖定的行數(從上面數),可以是0,表示不鎖定行。
第三個參數:要鎖定的列數(從左面數),可以是0,表示不鎖定列。
第四個參數:要鎖定的table的ID。
好了搞定。有幾個注意事項。
1、如果div裡隻有一個table,沒有其他的,那麼可以不傳遞tableID這個參數。
2、table的width不能設定百分比的形式,比如100%,這樣很可能造成table被擠在div裡面,沒有橫向的滾動。
對了,還要說一下缺點:
1、代碼比較爛。初學jQuery,js的功底也很差,是以現在的1.0版本的代碼隻是實作了基本的功能,代碼的美觀、運作效率那就很差了,以後還需要繼續前進。
2、td的高度和寬度還是差了一些,不過基本上可以忍受。還需要繼續調整。
3、table的行數比較多時(大于100行),初始化時間會很長。初始化就是建立鎖定的行、列的部分。
下一步除了修改bug外,還要實作交替色、滑鼠跟随、單擊、輕按兩下、選擇變色等功能。