94 lines
3.4 KiB
JavaScript
94 lines
3.4 KiB
JavaScript
/* 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: 1.0.2
|
|
* Requires: jquery.1.3+
|
|
*/
|
|
jQuery.fn.fixedtableheader = function(options) {
|
|
var settings = jQuery.extend({ headerrowsize: 1, highlightrow: false, highlightclass: "highlight", top : "0" }, options);
|
|
this.each(function(i) {
|
|
var $tbl = $(this);
|
|
|
|
var $tblhfixed = $tbl.find("tr.header");
|
|
|
|
var headerelement = "th";
|
|
|
|
if ($tblhfixed.find(headerelement).length == 0)
|
|
{
|
|
headerelement = "td";
|
|
}
|
|
|
|
if ($tblhfixed.find(headerelement).length > 0)
|
|
{
|
|
$tblhfixed.find(headerelement).each(function()
|
|
{
|
|
$(this).css("width", $(this).width());
|
|
});
|
|
|
|
var $clonedTable = $tbl.clone().empty();
|
|
|
|
var tblwidth = GetTblWidth($tbl);
|
|
|
|
$clonedTable.attr("id", "fixedtableheader" + i)
|
|
.css({ "position": "fixed", "top": settings.top, "left": $tbl.offset().left })
|
|
.append($('<thead>').append($tblhfixed.clone()))
|
|
.width(tblwidth)
|
|
.hide()
|
|
.addClass('fixed-header-block')
|
|
.appendTo($("body"));
|
|
|
|
if (settings.highlightrow)
|
|
{
|
|
$("tr:gt(" + (settings.headerrowsize - 1) + ")", $tbl)
|
|
.hover(
|
|
function()
|
|
{
|
|
$(this).addClass(settings.highlightclass);
|
|
},
|
|
function()
|
|
{
|
|
$(this).removeClass(settings.highlightclass);
|
|
});
|
|
}
|
|
|
|
$(window).scroll(function()
|
|
{
|
|
if (jQuery.browser.msie && jQuery.browser.version == "6.0")
|
|
{
|
|
$clonedTable.css({ "position": "absolute", "top": settings.top + $(window).scrollTop(), "left": $tbl.offset().left });
|
|
}
|
|
else
|
|
{
|
|
$clonedTable.css({ "position": "fixed", "top": settings.top, "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())
|
|
{
|
|
$tblhfixed.find(headerelement).each(function(index)
|
|
{
|
|
var w = $(this).width();
|
|
$(this).css("width", w);
|
|
$clonedTable.find(headerelement).eq(index).css("width", w);
|
|
});
|
|
$clonedTable.width($tbl.outerWidth());
|
|
}
|
|
$clonedTable.css("left", $tbl.offset().left);
|
|
});
|
|
}
|
|
});
|
|
function GetTblWidth($tbl) {
|
|
var tblwidth = $tbl.outerWidth();
|
|
return tblwidth;
|
|
}
|
|
}; |