JQuery固定表头插件fixedtableheader源码注释
在开发XX车站信息系统时,需要将大量数据显示在一个巨大的表格内部,由于表格是一个整体,无法分页,加之数据很多,超出一屏,为了方便用户,决定使用固定表头的插件,经过测试,发现JQuery 插件:fixedtableheader可以简单方便的实现功能。
它的使用很简单,需要设置的参数也只需2个,很实用。
使用方法:
//引入文件
<script type="mce-text/javascript" src="http://i.cnblogs.com/jquery.min.js"></script>
<script type="mce-text/javascript" src="http://i.cnblogs.com/jquery.fixedtableheader.min.js"><
//绑定表格,headerrowsize 后面的参数是绑定需要固定的表头的行数
<script type="mce-text/javascript">
$(document).ready(function() {
$('.tbl').fixedtableheader({
highlightrow: true, headerrowsize: 4
});
});
</script>
使用时,我发现js文件只有 4KB,我很好奇它是怎么实现的,于是就有了下文。
大致原理是:创建一个绝对定位的table,只包含表头。当表格被用户拖动超出屏幕时,表头表格显示;表格正常显示时,表头表格隐藏。
/* Copyright (c) 2009 Mustafa OZCAN (http://www.mustafaozcan.net)
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
* Version: .0.2
* Requires: jquery.1.3+
*/
jQuery.fn.fixedtableheader = function(options) {
var settings = jQuery.extend({ //jQuery.extend( target [, object1 ] [, objectN ] )
headerrowsize: 1, //这是默认参数
highlightrow: false,
highlightclass: "highlight"
},
options); //用户设置的参数
//如果用户设置参数,会覆盖对应的默认参数
this.each(function(i) { //处理每个table(该插件使用class属性绑定,会存在多个table)
var $tbl = $(this);
var $tblhfixed = $tbl.find("tr:lt(" + settings.headerrowsize + ")"); //找到要固定表头tr
var headerelement = "th";
if ($tblhfixed.find(headerelement).length == 0) headerelement = "td"; //没有th,默认td为表头单元格
if ($tblhfixed.find(headerelement).length > 0) { //有th单元格
$tblhfixed.find(headerelement).each(function() {
$(this).css("width", $(this).width()); //设置表头th宽度
});
var $clonedTable = $tbl.clone().empty(); //创建表头表格,即一对完整的table标签
var tblwidth = GetTblWidth($tbl);
$clonedTable.attr("id", "fixedtableheader" + i).css({ //设置悬浮表头绝对定位的位置
"position": "fixed",
"top": "0",
"left": $tbl.offset().left //.offset(): 获取表格的左边距
}).append($tblhfixed.clone()).width(tblwidth).hide().appendTo($("body")); //将表头插入table标签中
if (settings.highlightrow) //鼠标移过高亮
$("tr:gt(" + (settings.headerrowsize - 1) + ")", $tbl).hover(function() {
$(this).addClass(settings.highlightclass);
},
function() {
$(this).removeClass(settings.highlightclass);
});
$(window).scroll(function() { //当滚动条发生变化时触发scroll事件
if (jQuery.browser.msie && jQuery.browser.version == "6.0") //IE6.0
$clonedTable.css({ //
"position": "absolute",
"top": $(window).scrollTop(),
"left": $tbl.offset().left
});
else $clonedTable.css({
"position": "fixed",
"top": "0",
"left": $tbl.offset().left - $(window).scrollLeft()
})
var sctop = $(window).scrollTop(); //页面滚动条向下滚动的高度,也即页面被隐藏的高度
var elmtop = $tblhfixed.offset().top; //此时原始表格距离浏览器客户区顶端的高度
if (sctop > elmtop && sctop <= (elmtop + $tbl.height() - $tblhfixed.height()))
$clonedTable.show(); //原来的表头被滚动的不可见并且表格主体尚未被滚动出屏幕
else
$clonedTable.hide(); //
});
$(window).resize(function() {
if ($clonedTable.outerWidth() != $tbl.outerWidth()) { //若悬浮表跟不上resize的变化
$tblhfixed.find(headerelement).each(function(index) { //重新设置悬浮表头clonedTable每个th/td的宽度
var w = $(this).width();
$(this).css("width", w);
$clonedTable.find(headerelement).eq(index).css("width", w);
});
$clonedTable.width($tbl.outerWidth()); //设置悬浮表的宽度,注意这里.width()和css('width')的区别
}
$clonedTable.css("left", $tbl.offset().left); //jquery中offset是相对于浏览器客户区的相对偏移
});
}
});
function GetTblWidth($tbl) { //获取元素宽度(包括padding和border)
var tblwidth = $tbl.outerWidth();
return tblwidth;
}
};
在注释该代码过程中,一个很严重的疑惑产生了:
JQuery的.width() 和 CSS width 貌似不统一,有很大区别!所以又细细深入研究了一番,收获详见这里。
IE6不能使用position:fixed,具体见这里。
后记:2014-06-17
其实这个根本就达不到所谓的“fixtableheader”的效果,因为它只是简单的额把所有的表头都固定在了浏览器客户区的顶部,而非是table所在区域的顶部。
JQuery固定表头插件fixedtableheader源码注释的更多相关文章
- 原生javascript 固定表头原理与源码
我在工作中需要固定表头这个功能,我不想去找,没意思.于是就写了一个,我写的是angularjs 自定义指令 起了个 "fix-header" ,有人叫 "freeze- ...
- 14款让前端开发者心动的jQuery/CSS3插件及源码
14款让前端开发者心动的jQuery/CSS3插件及源码,一起来看看. 1.jQuery左右滚动banner代码! DEMO演示 / 源码下载 2.jQuery QQ表情插件qqFace ...
- 轮播插件unsilder 源码解析(一)---使用
啰嗦几句:学习的可以直接省略,一直本着写原生的插件想法,但是前天看了吕大豹的博客觉得自己都没有正经的写个jquery插件:所以在开始写之前我会先对几个比较热门的jquery的插件进行源码分析:至于为什 ...
- 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 百篇博客分析OpenHarmony源码 | v13.02
百篇博客系列篇.本篇为: v13.xx 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 51.c.h .o 几点说明 kernel_liteos_a_note | 中文注解鸿蒙内核 ...
- 精美jQuery插件及源码 前端开发福利
jQuery是一个非常不错的javascript框架,很多前端开发者喜欢的原因不仅是因为jQuery使用起来方便,更重要的是因为它的插件很多,我们可以将这些插件应用到自己的项目中去.下面这些精美的jQ ...
- jQuery超炫酷按钮插件及源码
现在大部分网页的按钮都是经过美化的,那些原始的浏览器按钮太过于枯燥乏味,让用户失去和网站交互的兴趣.早期我们都是通过背景图片来美化网页按钮,而现在我们可以利用扩展性更好的CSS3来制作漂亮的网页按钮, ...
- 转:精美jQuery插件及源码 前端开发福利
原文来自于:http://www.html5tricks.com/pretty-jquery-plugin.html jQuery是一个非常不错的javascript框架,很多前端开发者喜欢的原因不仅 ...
- 7款经典炫酷的HTML5/jQuery动画应用示例及源码
jQuery是一款普遍受前端开发者欢迎的Javascript框架,但是开发者貌似更关注jQuery开发的插件,海量的jQuery插件让前端开发者非常方便.HTML5的加入让jQuery这个家族更加丰富 ...
- 九款酷炫基于jquery实现的应用及源码
1.HTML5 Loading动画加载 五彩的圆环Loading 今天我们要分享一款基于HTML5的Loading加载动画特效,这款HTML5加载动画是一个五彩的圆环,圆环不停地转动从而体现加载正在进 ...
随机推荐
- instanceof的用法①
public class typeof1{ private String a="zzw"; public void instance(){ if(a instanceof Stri ...
- 万能的everything彻底解决mysql问题
万能的everthing D:\RECYCLER\S-1-5-21-1214440339-1123561945-1801674531-500\Dd16.0\my.ini可能之前的电脑的隐藏文件没有删除 ...
- 表达式:使用API创建表达式树(4)DynamicExpression
DynamicExpression:表示动态操作.这个网上可见的资料少得可怜,但想到MVC和第三方的动态语言能在NET运行.好奇的倒腾了下 先声明两个类(有相同的方法和字段,但不是继承于同一接口的类) ...
- HBuilder使用感受
最近公司在考虑搞HTML5和后台交互的架构,我于是便下载了HBuilder使用,这里分享下我偶的使用感受. 一.首先,下载下来是一个压缩包,解压后是可以直接使用的,这让我对它的第一感觉很好.不用安装, ...
- sql语句中like的使用
先看一道题: 写出一条sql语句,找出表B中 字段Value中不全是字母 数字 下划线的数据 初看这道题,我们想到可以用like去进行模糊匹配,找出想要的结果.但是有一个地方需要注意:如果想在SQL ...
- SGU 143.Long Live the Queen(女王万岁)
时间限制:0.25s 空间限制:4M 题意: 有n(n<=16000)个小镇,每两个小镇有且仅有一条路径相连.每个小镇有一个收益x(-1000<=x<=1000). 现在要求,选择一 ...
- Unable to load configuration. - bean - jar: ....struts2-core-2.1.8.1.jar!/struts-default.xml:47:178
摘录的异常代码: 2013-12-14 22:42:07 com.opensymphony.xwork2.util.logging.commons.CommonsLogger error严重: Dis ...
- C# 控制台程序设置字体颜色
这几天做了个程序,程序本身很简单.大体功能是输入查询条件,从数据库里取出结果计算并显示.但是用户的要求是使用控制台(console)来实现功能.由于功能简单,程序很快就做完了,在面向用户演示程序时,突 ...
- Laravel PHP Web开发框架
Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁.富于 ...
- Android 视图切换库的使用 - SwitichLayout
要点: 1. SwitichLayout 原理和基本特效展示 - 设计上和基本特效 2. SwitchLayout 的用法 - SwitchLayout 的基本配置和用法 3. SwithLayout ...