(function($) { $.fn.fixedHeader = function (options) { var config = { topOffset: 38 //bgColor: 'white' }; if (options){ $.extend(config, options); } return this.each( function() { var o = $(this); var $win = $(window) , $head = $('thead.header', o) , isFixed = 0; var headTop = $head.length && $head.offset().top - config.topOffset; function processScroll() { if (!o.is(':visible')) return; if ($('thead.header-copy').size()) { $('thead.header-copy').width($head.width()); var i, scrollTop = $win.scrollTop(); } var t = $head.length && $head.offset().top - config.topOffset; if (!isFixed && headTop != t) { headTop = t; } if (scrollTop >= headTop && !isFixed) { isFixed = 1; } else if (scrollTop <= headTop && isFixed) { isFixed = 0; } isFixed ? $('thead.header-copy', o).show().offset({ left: $head.offset().left }) : $('thead.header-copy', o).hide(); // NG: dislocate while iframe page resized. fixed by jeffen@pactera 2015/7/8 headerCopyRectify(); } // set a broken bone when header copy dislocated function headerCopyRectify() { o.find('thead.header > tr > th').each(function (i, h) { var w = $(h).width(); o.find('thead.header-copy> tr > th:eq('+i+')').width(w) }); } $win.on('scroll', processScroll); // NG: dislocate while body resized. fixed by jeffen@pactera 2015/7/9 $win.on('resize', processScroll); // hack sad times - holdover until rewrite for 2.1 $head.on('click', function () { if (!isFixed) setTimeout(function () { $win.scrollTop($win.scrollTop() - 47) }, 10); }) $(this).find(".header-copy").remove() $head.clone(true).removeClass('header').addClass('header-copy header-fixed').css({'position': 'fixed', 'top': config['topOffset']}).appendTo(o); o.find('thead.header-copy').width($head.width()); headerCopyRectify(); $head.css({ margin:'0 auto', width: o.width(), 'background-color':config.bgColor }); processScroll(); }); }; })(jQuery);