vendor: 4,642 bytes, lines 1-158
1/* ======================================================================== 2 * Bootstrap: scrollspy.js v3.0.0 3 * http://twbs.github.com/bootstrap/javascript.html#scrollspy 4 * ======================================================================== 5 * Copyright 2012 Twitter, Inc. 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * ======================================================================== */ 19 20 21+function ($) { "use strict"; 22 23 // SCROLLSPY CLASS DEFINITION 24 // ========================== 25 26 function ScrollSpy(element, options) { 27 var href 28 var process = $.proxy(this.process, this) 29 30 this.$element = $(element).is('body') ? $(window) : $(element) 31 this.$body = $('body') 32 this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process) 33 this.options = $.extend({}, ScrollSpy.DEFAULTS, options) 34 this.selector = (this.options.target 35 || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 36 || '') + ' .nav li > a' 37 this.offsets = $([]) 38 this.targets = $([]) 39 this.activeTarget = null 40 41 this.refresh() 42 this.process() 43 } 44 45 ScrollSpy.DEFAULTS = { 46 offset: 10 47 } 48 49 ScrollSpy.prototype.refresh = function () { 50 var offsetMethod = this.$element[0] == window ? 'offset' : 'position' 51 52 this.offsets = $([]) 53 this.targets = $([]) 54 55 var self = this 56 var $targets = this.$body 57 .find(this.selector) 58 .map(function () { 59 var $el = $(this) 60 var href = $el.data('target') || $el.attr('href') 61 var $href = /^#\w/.test(href) && $(href) 62 63 return ($href 64 && $href.length 65 && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null 66 }) 67 .sort(function (a, b) { return a[0] - b[0] }) 68 .each(function () { 69 self.offsets.push(this[0]) 70 self.targets.push(this[1]) 71 }) 72 } 73 74 ScrollSpy.prototype.process = function () { 75 var scrollTop = this.$scrollElement.scrollTop() + this.options.offset 76 var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight 77 var maxScroll = scrollHeight - this.$scrollElement.height() 78 var offsets = this.offsets 79 var targets = this.targets 80 var activeTarget = this.activeTarget 81 var i 82 83 if (scrollTop >= maxScroll) { 84 return activeTarget != (i = targets.last()[0]) && this.activate(i) 85 } 86 87 for (i = offsets.length; i--;) { 88 activeTarget != targets[i] 89 && scrollTop >= offsets[i] 90 && (!offsets[i + 1] || scrollTop <= offsets[i + 1]) 91 && this.activate( targets[i] ) 92 } 93 } 94 95 ScrollSpy.prototype.activate = function (target) { 96 this.activeTarget = target 97 98 $(this.selector) 99 .parents('.active') 100 .removeClass('active') 101 102 var selector = this.selector 103 + '[data-target="' + target + '"],' 104 + this.selector + '[href="' + target + '"]' 105 106 var active = $(selector) 107 .parents('li') 108 .addClass('active') 109 110 if (active.parent('.dropdown-menu').length) { 111 active = active 112 .closest('li.dropdown') 113 .addClass('active') 114 } 115 116 active.trigger('activate') 117 } 118 119 120 // SCROLLSPY PLUGIN DEFINITION 121 // =========================== 122 123 var old = $.fn.scrollspy 124 125 $.fn.scrollspy = function (option) { 126 return this.each(function () { 127 var $this = $(this) 128 var data = $this.data('bs.scrollspy') 129 var options = typeof option == 'object' && option 130 131 if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) 132 if (typeof option == 'string') data[option]() 133 }) 134 } 135 136 $.fn.scrollspy.Constructor = ScrollSpy 137 138 139 // SCROLLSPY NO CONFLICT 140 // ===================== 141 142 $.fn.scrollspy.noConflict = function () { 143 $.fn.scrollspy = old 144 return this 145 } 146 147 148 // SCROLLSPY DATA-API 149 // ================== 150 151 $(window).on('load', function () { 152 $('[data-spy="scroll"]').each(function () { 153 var $spy = $(this) 154 $spy.scrollspy($spy.data()) 155 }) 156 }) 157 158}(window.jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.