diff options
| author | Mark Otto <[email protected]> | 2014-07-07 22:10:22 -0700 |
|---|---|---|
| committer | Mark Otto <[email protected]> | 2014-07-07 22:10:22 -0700 |
| commit | 81b59d35368bc51d361d0352cc92fe99dc580fbf (patch) | |
| tree | 2395d5e79edaaa8c0a7ad82e99931ec895421532 /js/scrollspy.js | |
| parent | fed2b0f7eb78438eb1b768782b04651881d88740 (diff) | |
| parent | ddee04038f946ac103eb4e70c8eb7adeb2cf563b (diff) | |
| download | bootstrap-81b59d35368bc51d361d0352cc92fe99dc580fbf.tar.xz bootstrap-81b59d35368bc51d361d0352cc92fe99dc580fbf.zip | |
Merge branch 'master' into derp
Conflicts:
docs/_layouts/default.html
docs/assets/css/docs.min.css
docs/assets/css/src/docs.css
docs/assets/js/docs.min.js
docs/assets/js/src/application.js
Diffstat (limited to 'js/scrollspy.js')
| -rw-r--r-- | js/scrollspy.js | 61 |
1 files changed, 39 insertions, 22 deletions
diff --git a/js/scrollspy.js b/js/scrollspy.js index 137bd373f..db2378787 100644 --- a/js/scrollspy.js +++ b/js/scrollspy.js @@ -1,5 +1,5 @@ /* ======================================================================== - * Bootstrap: scrollspy.js v3.1.1 + * Bootstrap: scrollspy.js v3.2.0 * http://getbootstrap.com/javascript/#scrollspy * ======================================================================== * Copyright 2011-2014 Twitter, Inc. @@ -14,36 +14,48 @@ // ========================== function ScrollSpy(element, options) { - var href var process = $.proxy(this.process, this) - this.$element = $(element).is('body') ? $(window) : $(element) this.$body = $('body') - this.$scrollElement = this.$element.on('scroll.bs.scrollspy', process) + this.$scrollElement = $(element).is('body') ? $(window) : $(element) this.options = $.extend({}, ScrollSpy.DEFAULTS, options) - this.selector = (this.options.target - || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 - || '') + ' .nav li > a' - this.offsets = $([]) - this.targets = $([]) + this.selector = (this.options.target || '') + ' .nav li > a' + this.offsets = [] + this.targets = [] this.activeTarget = null + this.scrollHeight = 0 + this.$scrollElement.on('scroll.bs.scrollspy', process) this.refresh() this.process() } + ScrollSpy.VERSION = '3.2.0' + ScrollSpy.DEFAULTS = { offset: 10 } + ScrollSpy.prototype.getScrollHeight = function () { + return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) + } + ScrollSpy.prototype.refresh = function () { - var offsetMethod = this.$element[0] == window ? 'offset' : 'position' + var offsetMethod = 'offset' + var offsetBase = 0 - this.offsets = $([]) - this.targets = $([]) + if (!$.isWindow(this.$scrollElement[0])) { + offsetMethod = 'position' + offsetBase = this.$scrollElement.scrollTop() + } + + this.offsets = [] + this.targets = [] + this.scrollHeight = this.getScrollHeight() var self = this - var $targets = this.$body + + this.$body .find(this.selector) .map(function () { var $el = $(this) @@ -53,7 +65,7 @@ return ($href && $href.length && $href.is(':visible') - && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null + && [[$href[offsetMethod]().top + offsetBase, href]]) || null }) .sort(function (a, b) { return a[0] - b[0] }) .each(function () { @@ -64,15 +76,19 @@ ScrollSpy.prototype.process = function () { var scrollTop = this.$scrollElement.scrollTop() + this.options.offset - var scrollHeight = this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) - var maxScroll = scrollHeight - this.$scrollElement.height() + var scrollHeight = this.getScrollHeight() + var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() var offsets = this.offsets var targets = this.targets var activeTarget = this.activeTarget var i + if (this.scrollHeight != scrollHeight) { + this.refresh() + } + if (scrollTop >= maxScroll) { - return activeTarget != (i = targets.last()[0]) && this.activate(i) + return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) } if (activeTarget && scrollTop <= offsets[0]) { @@ -83,7 +99,7 @@ activeTarget != targets[i] && scrollTop >= offsets[i] && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) - && this.activate( targets[i] ) + && this.activate(targets[i]) } } @@ -115,9 +131,7 @@ // SCROLLSPY PLUGIN DEFINITION // =========================== - var old = $.fn.scrollspy - - $.fn.scrollspy = function (option) { + function Plugin(option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.scrollspy') @@ -128,6 +142,9 @@ }) } + var old = $.fn.scrollspy + + $.fn.scrollspy = Plugin $.fn.scrollspy.Constructor = ScrollSpy @@ -146,7 +163,7 @@ $(window).on('load.bs.scrollspy.data-api', function () { $('[data-spy="scroll"]').each(function () { var $spy = $(this) - $spy.scrollspy($spy.data()) + Plugin.call($spy, $spy.data()) }) }) |
