在开发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所在区域的顶部。

请看这个演示错误的Demo

JQuery固定表头插件fixedtableheader源码注释的更多相关文章

  1. 原生javascript 固定表头原理与源码

    我在工作中需要固定表头这个功能,我不想去找,没意思.于是就写了一个,我写的是angularjs 自定义指令 起了个 "fix-header" ,有人叫  "freeze- ...

  2. 14款让前端开发者心动的jQuery/CSS3插件及源码

    14款让前端开发者心动的jQuery/CSS3插件及源码,一起来看看. 1.jQuery左右滚动banner代码! DEMO演示    /    源码下载 2.jQuery QQ表情插件qqFace ...

  3. 轮播插件unsilder 源码解析(一)---使用

    啰嗦几句:学习的可以直接省略,一直本着写原生的插件想法,但是前天看了吕大豹的博客觉得自己都没有正经的写个jquery插件:所以在开始写之前我会先对几个比较热门的jquery的插件进行源码分析:至于为什 ...

  4. 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 百篇博客分析OpenHarmony源码 | v13.02

    百篇博客系列篇.本篇为: v13.xx 鸿蒙内核源码分析(源码注释篇) | 鸿蒙必定成功,也必然成功 | 51.c.h .o 几点说明 kernel_liteos_a_note | 中文注解鸿蒙内核 ...

  5. 精美jQuery插件及源码 前端开发福利

    jQuery是一个非常不错的javascript框架,很多前端开发者喜欢的原因不仅是因为jQuery使用起来方便,更重要的是因为它的插件很多,我们可以将这些插件应用到自己的项目中去.下面这些精美的jQ ...

  6. jQuery超炫酷按钮插件及源码

    现在大部分网页的按钮都是经过美化的,那些原始的浏览器按钮太过于枯燥乏味,让用户失去和网站交互的兴趣.早期我们都是通过背景图片来美化网页按钮,而现在我们可以利用扩展性更好的CSS3来制作漂亮的网页按钮, ...

  7. 转:精美jQuery插件及源码 前端开发福利

    原文来自于:http://www.html5tricks.com/pretty-jquery-plugin.html jQuery是一个非常不错的javascript框架,很多前端开发者喜欢的原因不仅 ...

  8. 7款经典炫酷的HTML5/jQuery动画应用示例及源码

    jQuery是一款普遍受前端开发者欢迎的Javascript框架,但是开发者貌似更关注jQuery开发的插件,海量的jQuery插件让前端开发者非常方便.HTML5的加入让jQuery这个家族更加丰富 ...

  9. 九款酷炫基于jquery实现的应用及源码

    1.HTML5 Loading动画加载 五彩的圆环Loading 今天我们要分享一款基于HTML5的Loading加载动画特效,这款HTML5加载动画是一个五彩的圆环,圆环不停地转动从而体现加载正在进 ...

随机推荐

  1. C#语法糖之第一篇:自动属性&隐式类型

    今天给大家分享一下C#语法糖的简单的两个知识点吧. 自动属性:在 C# 4.0 和更高版本中,当属性的访问器中不需要其他逻辑时,自动实现的属性可使属性声明更加简洁. 客户端代码还可通过这些属性创建对象 ...

  2. OBJECT和EMBED标签(转载)

    一.介绍: 我们要在网页中正常显示flash内容,那么页面中必须要有指定flash路径的标 签.也就是OBJECT和EMBED标签.OBJECT标签是用于windows平台的IE浏览器的,而EMBED ...

  3. ReactiveCocoa入门教程——第一部分

      ReactiveCocoa iOS 翻译    2015-01-22 02:33:37    11471    6    15 本文翻译自RayWenderlich  ReactiveCocoa ...

  4. SGU 124.Broken line

    时间限制:0.25s 空间限制:4M 题意: 给出n条线段和一个点,保证所有线段平行X轴或Y,并且闭合成一个多边形.判断这个点的位置是在多边形上,还是多边形内,还是多边形外. solution: 由于 ...

  5. 【BZOJ2049】【LCT】Cave 洞穴勘测

    Description 辉 辉热衷于洞穴勘测.某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通 道组成,并且每条通道连接了 ...

  6. windows7 jdk 环境变量添加

    JAVA_HOME D:\Java;PATH %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;CLASSPATH .;%JAVA_HOME%\lib;%JAVA_HOME%\l ...

  7. Jquery 获取日期date()对象

    获取JavaScript 的时间使用内置的Date函数完成 var mydate = new Date(); mydate.getYear(); //获取当前年份(2位) mydate.getFull ...

  8. Jquery 全选、反选

    jQuery 1.9以后用 prop(); 不用attr 等 $(function() { $('#inputCheck').click(function() { $("input[name ...

  9. jQuery 元素移除empty() remove()与detach()的区别?

    @1.empty() 删除匹配元素集合中所有的后代字节点元素: <p>hello<span>world</span></p> $("p&quo ...

  10. 关于DEDECMS自定义模型当中添加自定义字段后在后台添加内容后不显示解决方案

    用DEDECMS的时间也不长,最近在做一个站时,就遇到了这个问题(自定义字段在后台不显示内容)中添加自定义字段后在后台编辑打开后发现我之前添加的内容不显示,如果是只是看看不单击确定的话,那么在前台数据 ...