Skip to content

Instantly share code, notes, and snippets.

Created March 19, 2009 16:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/81927 to your computer and use it in GitHub Desktop.
Save anonymous/81927 to your computer and use it in GitHub Desktop.
// +---------------------------------------------+
// | jQuery plugin scrollTable |
// +---------------------------------------------+
// | @author: Juarez Gonçalves Nery Junior |
// | @email: juareznjunior@gmail.com |
// +---------------------------------------------+
// | <div id="myScroll"> |
// | <table>(..)</table> |
// | </div> |
// | $('div#myScroll').scrollTable({height:200}) |
// +---------------------------------------------+
;(function($){
$.fn.scrollTable = function(options){
var options = $.extend({},options);
// options
// height = int
// onComplete = function(){}
return this.each(function(){
var $self = $(this),selfDOM = this;
if (!$self.hasClass('hasGrid')) {
var $TABLE = $self.find('table').width('100%');
if (0 == $TABLE.length) {
return;
}
$self.addClass('hasGrid').width('100%');
var divHeader = document.createElement('div'),divFooter = document.createElement('div');
$(divHeader).addClass('divHeader').width('100%').append('<table><thead></thead></table>').insertBefore(selfDOM);
var attrTable = {
cellSpacing: $TABLE.get(0).cellSpacing||'',
cellPadding: $TABLE.get(0).cellPadding||''
};
var $TABLE_THEAD = $TABLE.find('thead'),$TABLE_TFOOT = $TABLE.find('tfoot');
var $TABLE_FOOTER_TFOOT = null;
if ($TABLE_TFOOT.length) {
$(divFooter).addClass('divFooter').width('100%').append('<table><tfoot></tfoot></table>').insertAfter(selfDOM);
var $divFooter = $(divFooter);
$TABLE_FOOTER_TFOOT = $divFooter.find('table').attr(attrTable).css({width:'100%'}).find('tfoot');
}
var $divHeader = $(divHeader);
var cpt = $('caption',$TABLE[0]);
var $TABLE_HEADER_THEAD = $divHeader.find('table').map(function(){
return ((cpt.length) ? $(this).append(cpt).get() : this);
}).attr(attrTable).css({width:'100%'}).find('thead');
var create = function(hf) {
var $elem = (hf=='header') ? $TABLE_THEAD : $TABLE_TFOOT
,$append = (hf=='header') ? $TABLE_HEADER_THEAD : $TABLE_FOOTER_TFOOT
,$tr = $elem.find('tr');
if ($tr.length) {
$tr.each(function(){
var selfTR = this;
var tr = document.createElement('tr'),th = document.createElement('th');
$(th).addClass('thScroll').css('width',12).appendTo(selfTR);
$(selfTR).find('th').each(function(){
var selfTH = this;
var css = {
width : $(selfTH).width(),
backgroundColor : $(selfTH).css('backgroundColor')
},
attr = {
rowSpan: selfTH.rowSpan,
colSpan: selfTH.colSpan
};
$(selfTH).clone(true).css(css).attr(attr).appendTo(tr);
});
$(tr).appendTo($append);
});
if (!$.browser.msie) {
$TABLE_THEAD.find('.thScroll').remove();
$TABLE_TFOOT.find('.thScroll').remove();
}
if (hf=='footer') {
$TABLE_TFOOT.css('visibility',(($.browser.msie) ? 'hidden' : 'collapse' )).find('.thScroll').remove();
}
}
};
create('header');
create('footer');
$self.css({
height: ('undefined' == typeof options.height) ? 200 : options.height,
overflowY: 'scroll',overflowX: 'hidden'
});
$divHeader.css({width:$self.width()});
var marginTop = 0;
$TABLE_THEAD.each(function(){
marginTop += parseInt($(this).height())
});
$TABLE.css({marginTop: parseInt(marginTop+ 2)*(-1)});
if ($.isFunction(options.onComplete)) {
// @param div selector $('#myDiv').scrollTable(); DOM
// @param div select > table - original table DOM
// @param div selector > div.divHeader DOM
// @param div selector > div.divFooter DOM
var _tfoot = ('null' === $TABLE_FOOTER_TFOOT) ? $TABLE_FOOTER_TFOOT.parent().get(0) : null;
options.onComplete.call(selfDOM,$TABLE.get(0),$TABLE_HEADER_THEAD.parent().get(0),_tfoot);
}
};
});
};
})(jQuery);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment