125 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
| /* =============================================================
 | |
|  * bootstrap-scrollspy.js v2.0.1
 | |
|  * http://twitter.github.com/bootstrap/javascript.html#scrollspy
 | |
|  * =============================================================
 | |
|  * Copyright 2012 Twitter, Inc.
 | |
|  *
 | |
|  * Licensed under the Apache License, Version 2.0 (the "License");
 | |
|  * you may not use this file except in compliance with the License.
 | |
|  * You may obtain a copy of the License at
 | |
|  *
 | |
|  * http://www.apache.org/licenses/LICENSE-2.0
 | |
|  *
 | |
|  * Unless required by applicable law or agreed to in writing, software
 | |
|  * distributed under the License is distributed on an "AS IS" BASIS,
 | |
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
|  * See the License for the specific language governing permissions and
 | |
|  * limitations under the License.
 | |
|  * ============================================================== */
 | |
| 
 | |
| !function ( $ ) {
 | |
| 
 | |
|   "use strict"
 | |
| 
 | |
|   /* SCROLLSPY CLASS DEFINITION
 | |
|    * ========================== */
 | |
| 
 | |
|   function ScrollSpy( element, options) {
 | |
|     var process = $.proxy(this.process, this)
 | |
|       , $element = $(element).is('body') ? $(window) : $(element)
 | |
|       , href
 | |
|     this.options = $.extend({}, $.fn.scrollspy.defaults, options)
 | |
|     this.$scrollElement = $element.on('scroll.scroll.data-api', process)
 | |
|     this.selector = (this.options.target
 | |
|       || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
 | |
|       || '') + ' .nav li > a'
 | |
|     this.$body = $('body').on('click.scroll.data-api', this.selector, process)
 | |
|     this.refresh()
 | |
|     this.process()
 | |
|   }
 | |
| 
 | |
|   ScrollSpy.prototype = {
 | |
| 
 | |
|       constructor: ScrollSpy
 | |
| 
 | |
|     , refresh: function () {
 | |
|         this.targets = this.$body
 | |
|           .find(this.selector)
 | |
|           .map(function () {
 | |
|             var href = $(this).attr('href')
 | |
|             return /^#\w/.test(href) && $(href).length ? href : null
 | |
|           })
 | |
| 
 | |
|         this.offsets = $.map(this.targets, function (id) {
 | |
|           return $(id).position().top
 | |
|         })
 | |
|       }
 | |
| 
 | |
|     , process: function () {
 | |
|         var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
 | |
|           , offsets = this.offsets
 | |
|           , targets = this.targets
 | |
|           , activeTarget = this.activeTarget
 | |
|           , i
 | |
| 
 | |
|         for (i = offsets.length; i--;) {
 | |
|           activeTarget != targets[i]
 | |
|             && scrollTop >= offsets[i]
 | |
|             && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
 | |
|             && this.activate( targets[i] )
 | |
|         }
 | |
|       }
 | |
| 
 | |
|     , activate: function (target) {
 | |
|         var active
 | |
| 
 | |
|         this.activeTarget = target
 | |
| 
 | |
|         this.$body
 | |
|           .find(this.selector).parent('.active')
 | |
|           .removeClass('active')
 | |
| 
 | |
|         active = this.$body
 | |
|           .find(this.selector + '[href="' + target + '"]')
 | |
|           .parent('li')
 | |
|           .addClass('active')
 | |
| 
 | |
|         if ( active.parent('.dropdown-menu') )  {
 | |
|           active.closest('li.dropdown').addClass('active')
 | |
|         }
 | |
|       }
 | |
| 
 | |
|   }
 | |
| 
 | |
| 
 | |
|  /* SCROLLSPY PLUGIN DEFINITION
 | |
|   * =========================== */
 | |
| 
 | |
|   $.fn.scrollspy = function ( option ) {
 | |
|     return this.each(function () {
 | |
|       var $this = $(this)
 | |
|         , data = $this.data('scrollspy')
 | |
|         , options = typeof option == 'object' && option
 | |
|       if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
 | |
|       if (typeof option == 'string') data[option]()
 | |
|     })
 | |
|   }
 | |
| 
 | |
|   $.fn.scrollspy.Constructor = ScrollSpy
 | |
| 
 | |
|   $.fn.scrollspy.defaults = {
 | |
|     offset: 10
 | |
|   }
 | |
| 
 | |
| 
 | |
|  /* SCROLLSPY DATA-API
 | |
|   * ================== */
 | |
| 
 | |
|   $(function () {
 | |
|     $('[data-spy="scroll"]').each(function () {
 | |
|       var $spy = $(this)
 | |
|       $spy.scrollspy($spy.data())
 | |
|     })
 | |
|   })
 | |
| 
 | |
| }( window.jQuery ); |