| /* ======================================================================== | |
| * Bootstrap: scrollspy.js v3.3.6 | |
| * http://getbootstrap.com/javascript/#scrollspy | |
| * ======================================================================== | |
| * Copyright 2011-2015 Twitter, Inc. | |
| * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) | |
| * ======================================================================== */ | |
| +function ($) { | |
| 'use strict'; | |
| // SCROLLSPY CLASS DEFINITION | |
| // ========================== | |
| function ScrollSpy(element, options) { | |
| this.$body = $(document.body) | |
| this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) | |
| this.options = $.extend({}, ScrollSpy.DEFAULTS, options) | |
| this.selector = (this.options.target || '') + ' .nav li > a' | |
| this.offsets = [] | |
| this.targets = [] | |
| this.activeTarget = null | |
| this.scrollHeight = 0 | |
| this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) | |
| this.refresh() | |
| this.process() | |
| } | |
| ScrollSpy.VERSION = '3.3.6' | |
| 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 that = this | |
| var offsetMethod = 'offset' | |
| var offsetBase = 0 | |
| this.offsets = [] | |
| this.targets = [] | |
| this.scrollHeight = this.getScrollHeight() | |
| if (!$.isWindow(this.$scrollElement[0])) { | |
| offsetMethod = 'position' | |
| offsetBase = this.$scrollElement.scrollTop() | |
| } | |
| this.$body | |
| .find(this.selector) | |
| .map(function () { | |
| var $el = $(this) | |
| var href = $el.data('target') || $el.attr('href') | |
| var $href = /^#./.test(href) && $(href) | |
| return ($href | |
| && $href.length | |
| && $href.is(':visible') | |
| && [[$href[offsetMethod]().top + offsetBase, href]]) || null | |
| }) | |
| .sort(function (a, b) { return a[0] - b[0] }) | |
| .each(function () { | |
| that.offsets.push(this[0]) | |
| that.targets.push(this[1]) | |
| }) | |
| } | |
| ScrollSpy.prototype.process = function () { | |
| var scrollTop = this.$scrollElement.scrollTop() + this.options.offset | |
| 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[targets.length - 1]) && this.activate(i) | |
| } | |
| if (activeTarget && scrollTop < offsets[0]) { | |
| this.activeTarget = null | |
| return this.clear() | |
| } | |
| for (i = offsets.length; i--;) { | |
| activeTarget != targets[i] | |
| && scrollTop >= offsets[i] | |
| && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) | |
| && this.activate(targets[i]) | |
| } | |
| } | |
| ScrollSpy.prototype.activate = function (target) { | |
| this.activeTarget = target | |
| this.clear() | |
| var selector = this.selector + | |
| '[data-target="' + target + '"],' + | |
| this.selector + '[href="' + target + '"]' | |
| var active = $(selector) | |
| .parents('li') | |
| .addClass('active') | |
| if (active.parent('.dropdown-menu').length) { | |
| active = active | |
| .closest('li.dropdown') | |
| .addClass('active') | |
| } | |
| active.trigger('activate.bs.scrollspy') | |
| } | |
| ScrollSpy.prototype.clear = function () { | |
| $(this.selector) | |
| .parentsUntil(this.options.target, '.active') | |
| .removeClass('active') | |
| } | |
| // SCROLLSPY PLUGIN DEFINITION | |
| // =========================== | |
| function Plugin(option) { | |
| return this.each(function () { | |
| var $this = $(this) | |
| var data = $this.data('bs.scrollspy') | |
| var options = typeof option == 'object' && option | |
| if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) | |
| if (typeof option == 'string') data[option]() | |
| }) | |
| } | |
| var old = $.fn.scrollspy | |
| $.fn.scrollspy = Plugin | |
| $.fn.scrollspy.Constructor = ScrollSpy | |
| // SCROLLSPY NO CONFLICT | |
| // ===================== | |
| $.fn.scrollspy.noConflict = function () { | |
| $.fn.scrollspy = old | |
| return this | |
| } | |
| // SCROLLSPY DATA-API | |
| // ================== | |
| $(window).on('load.bs.scrollspy.data-api', function () { | |
| $('[data-spy="scroll"]').each(function () { | |
| var $spy = $(this) | |
| Plugin.call($spy, $spy.data()) | |
| }) | |
| }) | |
| }(jQuery); |