jQuery 关于ScrollableGridPlugin.js(固定表头)插件的逐步解析

简介:

以前写前台的时候需要用哪些效果从来都是有现成的东西拿来就用的,因为自己真的是有些懒,毫无探索精神,只重视结果,不追求过程。

这个ScrollableGridPlugin.js是从网上找到的一个具有固定表头效果的插件,使用起来灰常的简便,而且效果也是看着不错的。不过毕竟不是量身定做的,所以有的地方在自己的项目中还是要进行一点点小改动,因为实在是太喜欢这个插件了,所以第一次进到里面,看看原作者的思路和写法,然后才能知道如何去改成适合自己项目。

对于js我完全是一个非常业余的选手,下面根据自己的现状对这个插件做了分析,反正自己是搞明白怎么回事了,有分析不对的,还请高手指教。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
/*!
* This plug-in is developed for ASP.Net GridView control to make the GridView scrollable with Fixed headers.
*/
( function  ($) {
     $.fn.Scrollable =  function  (options) { //1、定义一个jQuery实例方法,也是我们调用这个插件的入口
         var  defaults = {
             ScrollHeight: 300,
             Width: 0
         };
         var  options = $.extend(defaults, options);  //2、扩展集合,如果外部没有传入ScrollHeight的值,就默认使用300这个值,如果传入,就用传入的ScrollHeight值
         return  this .each( function  () {
             var  grid = $( this ).get(0); //3、获取当前gridview控件的对象
             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、创建了一个存储表头各个标题列的宽度的数组
             grid.parentNode.appendChild(document.createElement( "div" )); //6、在文档中gridview的同级位置最后加一个div元素
             var  parentDiv = grid.parentNode; //7、gridview的父节点,是个div
 
             var  table = document.createElement( "table" ); //8、在dom中创建一个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的所有属性加到新创建的table元素上
             table.style.cssText = grid.style.cssText; //10、将样式也加到table元素上
             table.style.width = gridWidth +  "px" ; //11、为table元素设置与gridview同样的宽
             table.appendChild(document.createElement( "tbody" )); //12、为table元素加一个tbody元素
             table.getElementsByTagName( "tbody" )[0].appendChild(grid.getElementsByTagName( "TR" )[0]); //13、把gridview中的第一行数据加到tbody元素中,即table里现在存着一行gridview的标题元素,同时在gridview里删除了标题这一行的元素
             var  cells = table.getElementsByTagName( "TH" ); //14、取得表格标题列的集合
 
             var  gridRow = grid.getElementsByTagName( "TR" )[0]; //15、gridview中第一行数据列的集合
             for  ( var  i = 0; i < cells.length; i++) {
                 var  width;
                 if  (headerCellWidths[i] > gridRow.getElementsByTagName( "TD" )[i].offsetWidth) { //16、如果标题格的宽度大于数据列的宽度
                     width = headerCellWidths[i];
                 }
                 else  { //17、如果标题格的宽度小于数据列的宽度
                     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、将每个标题列和数据列的宽度均调整为取其中更宽的一个,-3是出于对表格的样式进行微调考虑,不是必须
             }
             parentDiv.removeChild(grid); //19、删除gridview控件(注意只是从文档流中删除,实际还在内存当中,注意27条),现在的情况是table里只有一个表头
 
             var  dummyHeader = document.createElement( "div" ); //20、在文档中再创建一个div元素
             dummyHeader.appendChild(table); //21、把表头table加入其中
             parentDiv.appendChild(dummyHeader); //22、把这个div插入到原来gridview的位置里
             if  (options.Width > 0) { //23、如果我们最初传入了一个想要的表格宽度值,就将gridWidth赋上这个值
                 gridWidth = options.Width;
             }
             var  scrollableDiv = document.createElement( "div" ); //24、再创建一个div
             gridWidth = parseInt(gridWidth) + 17; //25、在原基础上+17是因为这是一个具有滑动条的table,当出现滑动条的时候,会在宽度上多出一个条的宽度,为了使数据列与标题列保持一致,要把这个宽度算进行,17这个值也不是必须,这个可以试验着来。
             scrollableDiv.style.cssText =  "overflow:auto;height:"  + options.ScrollHeight +  "px;width:"  + gridWidth +  "px" ; //26、给具有滚动条的div加上样式,height就是我们想让它在多大的长度时出现滚动条
             scrollableDiv.appendChild(grid); //27、将gridview(目前只存在数据存在数据列)加到这个带有滚动条的div中,这里是从内存中将grid取出
             parentDiv.appendChild(scrollableDiv); //28、将带有滚动条的div加到table的下面
         });
     };
})(jQuery);

只有弄明白插件内部是怎么回事,才能知道如何去修改。

其实这里有个地方我还是不太明白,baidu之后也没能弄明白,希望明白的朋友能告诉一下,就是13和15这两个地方都用了grid.getElementsByTagName("TR")[0]);这条语句,从表面上看应该是得到的同一个tr吧?但是我通过浏览器去跟踪的时候,发现13里调用的,得到的是grid的第一个tr,就是包含th列的标题tr,15里的也是grid里的第一个tr,但是包含的是td列的第一条数据列tr。

怪就怪在执行完13后,grid里tr数少了1,就是少了包含th列的tr。我以为是appendChild方法是转移元素进行插入,而不是复制元素进行插入,但是通过查这个方法并没有明确说明是我想的那么回事。我就有些懵了。

这个插件的调用方法如下,感兴趣的朋友可以使用试试,感觉真的非常好。

1
2
3
4
5
6
7
8
9
     <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>









本文转自 我不会抽烟 51CTO博客,原文链接:http://blog.51cto.com/zhouhongyu1989/1436686,如需转载请自行联系原作者

目录
相关文章
|
11天前
|
JavaScript 前端开发 C++
|
4天前
|
JSON 前端开发 JavaScript
【JavaScript技术专栏】JavaScript异步编程:Promise、async/await解析
【4月更文挑战第30天】JavaScript中的异步编程通过Promise和async/await来解决回调地狱问题。Promise代表可能完成或拒绝的异步操作,有pending、fulfilled和rejected三种状态。它支持链式调用和Promise.all()、Promise.race()等方法。async/await是ES8引入的语法糖,允许异步代码以同步风格编写,提高可读性和可维护性。两者结合使用能更高效地处理非阻塞操作。
|
2天前
|
JavaScript 前端开发 C++
【Web 前端】JavaScript window.onload 事件和 jQuery ready 函数有何不同?
【5月更文挑战第2天】【Web 前端】JavaScript window.onload 事件和 jQuery ready 函数有何不同?
|
4天前
|
JavaScript 网络协议 数据处理
Node.js中的Buffer与Stream:深入解析与使用
【4月更文挑战第30天】本文深入解析了Node.js中的Buffer和Stream。Buffer是处理原始数据的全局对象,适用于TCP流和文件I/O,其大小在V8堆外分配。创建Buffer可通过`alloc`和`from`方法,它提供了读写、切片和转换等操作。Stream是处理流式数据的抽象接口,分为可读、可写、双工和转换四种类型,常用于处理大量数据而无需一次性加载到内存。通过监听事件和调用方法,如读取文件的可读流示例,可以实现高效的数据处理。理解和掌握Buffer及Stream能提升Node.js应用的性能。
|
5天前
|
JavaScript 前端开发 开发者
Node.js的包管理和npm工具深度解析
【4月更文挑战第30天】本文深入解析Node.js的包管理和npm工具。包管理促进代码复用和社区协作,包包含元数据描述文件`package.json`和入口文件。npm提供搜索、安装、发布等功能,通过命令行进行操作,如`install`、`search`、`uninstall`。npm支持版本控制、全局安装、脚本定义及私有仓库。理解和熟练运用npm能提升Node.js开发效率。
|
5天前
|
前端开发 JavaScript 数据安全/隐私保护
前端javascript的DOM对象操作技巧,全场景解析(二)
前端javascript的DOM对象操作技巧,全场景解析(二)
|
5天前
|
移动开发 缓存 JavaScript
前端javascript的DOM对象操作技巧,全场景解析(一)
前端javascript的DOM对象操作技巧,全场景解析(一)
|
6天前
|
JavaScript 大数据 开发者
Node.js的异步I/O模型与事件循环:深度解析
【4月更文挑战第29天】本文深入解析Node.js的异步I/O模型和事件循环机制。Node.js采用单线程与异步I/O,遇到I/O操作时立即返回并继续执行,结果存入回调函数队列。事件循环不断检查并处理I/O事件,通过回调函数通知结果,实现非阻塞和高并发。这种事件驱动编程模型简化了编程,使开发者更专注业务逻辑,为高并发场景提供高效解决方案。
|
9天前
|
JavaScript 前端开发 Linux
|
12天前
|
JavaScript 前端开发 开发者
JavaScript与TypeScript:深入解析两者之间的异同
【4月更文挑战第23天】本文对比分析了JavaScript和TypeScript的异同。作为JavaScript超集,TypeScript添加了静态类型和类等特性,有助于提升代码质量和可维护性。两者在语法上相似,都能在浏览器或Node.js环境中运行。JavaScript适合小项目和快速开发,而TypeScript适用于大型项目,因其静态类型和强大的生态系统能减少错误并便于团队协作。理解两者差异有助于开发人员根据项目需求作出合适选择。

推荐镜像

更多