jQuery中關(guān)于ScrollableGridPlugin.js(固定表頭)插件的使用逐步解析
這個(gè)ScrollableGridPlugin.js是從網(wǎng)上找到的一個(gè)具有固定表頭效果的插件,使用起來灰常的簡(jiǎn)便,而且效果也是看著不錯(cuò)的。不過畢竟不是量身定做的,所以有的地方在自己的項(xiàng)目中還是要進(jìn)行一點(diǎn)點(diǎn)小改動(dòng),因?yàn)閷?shí)在是太喜歡這個(gè)插件了,所以第一次進(jìn)到里面,看看原作者的思路和寫法,然后才能知道如何去改成適合自己項(xiàng)目。
對(duì)于js我完全是一個(gè)非常業(yè)余的選手,下面根據(jù)自己的現(xiàn)狀對(duì)這個(gè)插件做了分析,反正自己是搞明白怎么回事了,有分析不對(duì)的,還請(qǐng)高手指教。
/*!
* This plug-in is developed for ASP.Net GridView control to make the GridView scrollable with Fixed headers.
*/
(function ($) {
$.fn.Scrollable = function (options) {//1、定義一個(gè)jQuery實(shí)例方法,也是我們調(diào)用這個(gè)插件的入口
var defaults = {
ScrollHeight: 300,
Width: 0
};
var options = $.extend(defaults, options); //2、擴(kuò)展集合,如果外部沒有傳入ScrollHeight的值,就默認(rèn)使用300這個(gè)值,如果傳入,就用傳入的ScrollHeight值
return this.each(function () {
var grid = $(this).get(0);//3、獲取當(dāng)前gridview控件的對(duì)象
var gridWidth = grid.offsetWidth;//4、獲取gridview的寬度
var headerCellWidths = new Array();
for (var i = 0; i < grid.getElementsByTagName("TH").length; i++) {
headerCellWidths[i] = grid.getElementsByTagName("TH")[i].offsetWidth;
}//5、創(chuàng)建了一個(gè)存儲(chǔ)表頭各個(gè)標(biāo)題列的寬度的數(shù)組
grid.parentNode.appendChild(document.createElement("div"));//6、在文檔中g(shù)ridview的同級(jí)位置最后加一個(gè)div元素
var parentDiv = grid.parentNode;//7、gridview的父節(jié)點(diǎn),是個(gè)div
var table = document.createElement("table");//8、在dom中創(chuàng)建一個(gè)table元素
for (i = 0; i < grid.attributes.length; i++) {
if (grid.attributes[i].specified && grid.attributes[i].name != "id") {
table.setAttribute(grid.attributes[i].name, grid.attributes[i].value);
}
}//9、把gridview的所有屬性加到新創(chuàng)建的table元素上
table.style.cssText = grid.style.cssText;//10、將樣式也加到table元素上
table.style.width = gridWidth + "px";//11、為table元素設(shè)置與gridview同樣的寬
table.appendChild(document.createElement("tbody"));//12、為table元素加一個(gè)tbody元素
table.getElementsByTagName("tbody")[0].appendChild(grid.getElementsByTagName("TR")[0]);//13、把gridview中的第一行數(shù)據(jù)加到tbody元素中,即table里現(xiàn)在存著一行g(shù)ridview的標(biāo)題元素,同時(shí)在gridview里刪除了標(biāo)題這一行的元素
var cells = table.getElementsByTagName("TH");//14、取得表格標(biāo)題列的集合
var gridRow = grid.getElementsByTagName("TR")[0];//15、gridview中第一行數(shù)據(jù)列的集合
for (var i = 0; i < cells.length; i++) {
var width;
if (headerCellWidths[i] > gridRow.getElementsByTagName("TD")[i].offsetWidth) {//16、如果標(biāo)題格的寬度大于數(shù)據(jù)列的寬度
width = headerCellWidths[i];
}
else {//17、如果標(biāo)題格的寬度小于數(shù)據(jù)列的寬度
width = gridRow.getElementsByTagName("TD")[i].offsetWidth;
}
cells[i].style.width = parseInt(width - 3) + "px";
gridRow.getElementsByTagName("TD")[i].style.width = parseInt(width - 3) + "px";//18、將每個(gè)標(biāo)題列和數(shù)據(jù)列的寬度均調(diào)整為取其中更寬的一個(gè),-3是出于對(duì)表格的樣式進(jìn)行微調(diào)考慮,不是必須
}
parentDiv.removeChild(grid);//19、刪除gridview控件(注意只是從文檔流中刪除,實(shí)際還在內(nèi)存當(dāng)中,注意27條),現(xiàn)在的情況是table里只有一個(gè)表頭
var dummyHeader = document.createElement("div");//20、在文檔中再創(chuàng)建一個(gè)div元素
dummyHeader.appendChild(table);//21、把表頭table加入其中
parentDiv.appendChild(dummyHeader);//22、把這個(gè)div插入到原來gridview的位置里
if (options.Width > 0) {//23、如果我們最初傳入了一個(gè)想要的表格寬度值,就將gridWidth賦上這個(gè)值
gridWidth = options.Width;
}
var scrollableDiv = document.createElement("div");//24、再創(chuàng)建一個(gè)div
gridWidth = parseInt(gridWidth) + 17;//25、在原基礎(chǔ)上+17是因?yàn)檫@是一個(gè)具有滑動(dòng)條的table,當(dāng)出現(xiàn)滑動(dòng)條的時(shí)候,會(huì)在寬度上多出一個(gè)條的寬度,為了使數(shù)據(jù)列與標(biāo)題列保持一致,要把這個(gè)寬度算進(jìn)行,17這個(gè)值也不是必須,這個(gè)可以試驗(yàn)著來。
scrollableDiv.style.cssText = "overflow:auto;height:" + options.ScrollHeight + "px;width:" + gridWidth + "px";//26、給具有滾動(dòng)條的div加上樣式,height就是我們想讓它在多大的長度時(shí)出現(xiàn)滾動(dòng)條
scrollableDiv.appendChild(grid);//27、將gridview(目前只存在數(shù)據(jù)存在數(shù)據(jù)列)加到這個(gè)帶有滾動(dòng)條的div中,這里是從內(nèi)存中將grid取出
parentDiv.appendChild(scrollableDiv);//28、將帶有滾動(dòng)條的div加到table的下面
});
};
})(jQuery);
只有弄明白插件內(nèi)部是怎么回事,才能知道如何去修改。
其實(shí)這里有個(gè)地方我還是不太明白,baidu之后也沒能弄明白,希望明白的朋友能告訴一下,就是13和15這兩個(gè)地方都用了grid.getElementsByTagName("TR")[0]);這條語句,從表面上看應(yīng)該是得到的同一個(gè)tr吧?但是我通過瀏覽器去跟蹤的時(shí)候,發(fā)現(xiàn)13里調(diào)用的,得到的是grid的第一個(gè)tr,就是包含th列的標(biāo)題tr,15里的也是grid里的第一個(gè)tr,但是包含的是td列的第一條數(shù)據(jù)列tr。
怪就怪在執(zhí)行完13后,grid里tr數(shù)少了1,就是少了包含th列的tr。我以為是appendChild方法是轉(zhuǎn)移元素進(jìn)行插入,而不是復(fù)制元素進(jìn)行插入,但是通過查這個(gè)方法并沒有明確說明是我想的那么回事。我就有些懵了。
這個(gè)插件的調(diào)用方法如下,感興趣的朋友可以使用試試,感覺真的非常好。
<script type="text/javascript" src="../Scripts/PlugIn/ScrollableGridPlugin.js"></script>
<script type="text/javascript">
jQuery(document).ready(function () {
jQuery("#<%=gv_bugList.ClientID %>").Scrollable({
ScrollHeight: 400,
width: 500
});
})
</script>
- jquery tools 系列 scrollable(2)
- jquery tools 系列 scrollable學(xué)習(xí)
- jQuery控制li上下循環(huán)滾動(dòng)插件用法實(shí)例(附demo源碼下載)
- 基于JQuery實(shí)現(xiàn)仿網(wǎng)易郵箱全屏動(dòng)感滾動(dòng)插件fullPage
- 基于編寫jQuery的無縫滾動(dòng)插件
- 基于jQuery的圖片左右無縫滾動(dòng)插件
- 超級(jí)有用的13個(gè)基于jQuery的內(nèi)容滾動(dòng)插件和教程
- jQuery新聞滾動(dòng)插件 jquery.roller.js
- jcarousellite.js 基于Jquery的圖片無縫滾動(dòng)插件
- 基于jQuery圖片平滑連續(xù)滾動(dòng)插件
- jQuery滾動(dòng)插件scrollable.js用法分析
相關(guān)文章
jQuery focus和blur事件的應(yīng)用詳解
本篇文章主要是對(duì)jQuery中focus和blur事件的應(yīng)用進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2014-01-01
使用jQuery不判斷瀏覽器高度解決iframe自適應(yīng)高度問題
這篇文章主要介紹了使用jQuery不判斷瀏覽器高度解決iframe自適應(yīng)高度問題,需要的朋友可以參考下2014-12-12
Jquery中children與find之間的區(qū)別詳細(xì)解析
這篇文章主要是對(duì)Jquery中children與find之間的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-11-11
jquery validate和jquery form 插件組合實(shí)現(xiàn)驗(yàn)證表單后AJAX提交
在ajax流行的時(shí)代,好像很少能看見傳統(tǒng)的同步提交表單方式了,是啊我們當(dāng)然要用更加給力的AJAX來實(shí)現(xiàn)異步無刷新提交表單,好了開始今天的jQuery之旅吧,今天我們來利用jquery.validate和jquery.form 插件組合實(shí)現(xiàn)驗(yàn)證表單后AJAX提交 ,需要的朋友可以參考下2015-08-08
jquery實(shí)現(xiàn)LED廣告牌旋轉(zhuǎn)系統(tǒng)圖片切換效果代碼分享
這篇文章主要介紹了jquery實(shí)現(xiàn)LED廣告牌旋轉(zhuǎn)系統(tǒng)圖片切換效果類似路邊場(chǎng)景,很實(shí)用的代碼,推薦給大家,有需要的小伙伴可以參考下。2015-08-08

