diff --git a/lib/toc.js b/lib/toc.js index ef8f0c0..0c119e4 100644 --- a/lib/toc.js +++ b/lib/toc.js @@ -22,27 +22,45 @@ $.fn.toc = function(options) { $(e.target).parent().addClass(activeClassName); }; - //highlight on scroll - var timeout; - var highlightOnScroll = function(e) { - if (timeout) { - clearTimeout(timeout); - } - timeout = setTimeout(function() { - var top = $(window).scrollTop(), - highlighted; - for (var i = 0, c = headingOffsets.length; i < c; i++) { - if (headingOffsets[i] >= top) { - $('li', self).removeClass(activeClassName); - highlighted = $('li:eq('+(i-1)+')', self).addClass(activeClassName); - opts.onHighlight(highlighted); - break; - } + var debounce = function(func, ms) { + var timeout; + return function() { + var that = this; + if (timeout) { + clearTimeout(timeout); } - }, 50); + var callThen = function() { + timeout = null; + func.call(that); + }; + timeout = setTimeout(callThen, ms); + }; }; + + //highlight on scroll + var highlightOnScroll = debounce(function() { + var top = $(window).scrollTop(), + highlighted; + for (var i = 0, c = headingOffsets.length; i < c; i++) { + if (headingOffsets[i] >= top) { + $('li', self).removeClass(activeClassName); + highlighted = $('li:eq('+(i-1)+')', self).addClass(activeClassName); + opts.onHighlight(highlighted); + break; + } + } + }, 50); + var recalculateOffsets = debounce(function() { + headingOffsets.length = 0; + headings.each(function(i, heading) { + var $h = $(heading); + headingOffsets.push($h.offset().top - opts.highlightOffset); + }); + }, 50); if (opts.highlightOnScroll) { $(window).bind('scroll', highlightOnScroll); + $(window).bind('orientationchange resize', recalculateOffsets); + highlightOnScroll(); } @@ -52,7 +70,9 @@ $.fn.toc = function(options) { var ul = $('