From 1b647862393a6b4daf36494297c47f75c47ef78f Mon Sep 17 00:00:00 2001 From: Clemens Date: Sat, 18 May 2013 02:15:09 +0200 Subject: [PATCH 1/3] fixed bug where headingOffsets went out-of-sync on window resize --- lib/toc.js | 53 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/lib/toc.js b/lib/toc.js index ef8f0c0..436e24b 100644 --- a/lib/toc.js +++ b/lib/toc.js @@ -22,29 +22,46 @@ $.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); if (opts.highlightOnScroll) { $(window).bind('scroll', highlightOnScroll); highlightOnScroll(); } + var recalculateOffsets = debounce(function() { + headingOffsets.length = 0; + headings.each(function(i, heading) { + var $h = $(heading); + headingOffsets.push($h.offset().top - opts.highlightOffset); + }); + }, 50); + $(window).bind('orientationchange resize', recalculateOffsets); return this.each(function() { //build TOC @@ -97,4 +114,4 @@ jQuery.fn.toc.defaults = { }; -})(jQuery); +})(jQuery); \ No newline at end of file From b52a99ab3943d8a94e5ca39800465695f1305e53 Mon Sep 17 00:00:00 2001 From: Clemens Date: Sat, 18 May 2013 02:33:18 +0200 Subject: [PATCH 2/3] fixed mixed tabs and spaces --- lib/toc.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/toc.js b/lib/toc.js index 436e24b..50c5621 100644 --- a/lib/toc.js +++ b/lib/toc.js @@ -55,11 +55,11 @@ $.fn.toc = function(options) { highlightOnScroll(); } var recalculateOffsets = debounce(function() { - headingOffsets.length = 0; - headings.each(function(i, heading) { - var $h = $(heading); - headingOffsets.push($h.offset().top - opts.highlightOffset); - }); + headingOffsets.length = 0; + headings.each(function(i, heading) { + var $h = $(heading); + headingOffsets.push($h.offset().top - opts.highlightOffset); + }); }, 50); $(window).bind('orientationchange resize', recalculateOffsets); @@ -114,4 +114,4 @@ jQuery.fn.toc.defaults = { }; -})(jQuery); \ No newline at end of file +})(jQuery); From 660ab93a7e66d8016ff467aa91be81761b49975b Mon Sep 17 00:00:00 2001 From: Clemens Schneider Date: Mon, 30 Sep 2013 11:26:15 +0200 Subject: [PATCH 3/3] calculate offsets only if needed (needs lots of time in case of large selector-item-size) --- lib/toc.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/lib/toc.js b/lib/toc.js index 50c5621..0c119e4 100644 --- a/lib/toc.js +++ b/lib/toc.js @@ -50,18 +50,19 @@ $.fn.toc = function(options) { } } }, 50); - if (opts.highlightOnScroll) { - $(window).bind('scroll', highlightOnScroll); - highlightOnScroll(); - } var recalculateOffsets = debounce(function() { headingOffsets.length = 0; headings.each(function(i, heading) { - var $h = $(heading); + var $h = $(heading); headingOffsets.push($h.offset().top - opts.highlightOffset); }); }, 50); - $(window).bind('orientationchange resize', recalculateOffsets); + if (opts.highlightOnScroll) { + $(window).bind('scroll', highlightOnScroll); + $(window).bind('orientationchange resize', recalculateOffsets); + + highlightOnScroll(); + } return this.each(function() { //build TOC @@ -69,7 +70,9 @@ $.fn.toc = function(options) { var ul = $('
    '); headings.each(function(i, heading) { var $h = $(heading); - headingOffsets.push($h.offset().top - opts.highlightOffset); + if (opts.highlightOnScroll) { + headingOffsets.push($h.offset().top - opts.highlightOffset); + } //add anchor var anchor = $('').attr('id', opts.anchorName(i, heading, opts.prefix)).insertBefore($h);