151 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			151 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								/* =============================================================
							 | 
						||
| 
								 | 
							
								 * bootstrap-scrollspy.js v2.0.4
							 | 
						||
| 
								 | 
							
								 * 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"; // jshint ;_;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /* 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')
							 | 
						||
| 
								 | 
							
								    this.refresh()
							 | 
						||
| 
								 | 
							
								    this.process()
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ScrollSpy.prototype = {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      constructor: ScrollSpy
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    , refresh: function () {
							 | 
						||
| 
								 | 
							
								        var self = this
							 | 
						||
| 
								 | 
							
								          , $targets
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        this.offsets = $([])
							 | 
						||
| 
								 | 
							
								        this.targets = $([])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $targets = this.$body
							 | 
						||
| 
								 | 
							
								          .find(this.selector)
							 | 
						||
| 
								 | 
							
								          .map(function () {
							 | 
						||
| 
								 | 
							
								            var $el = $(this)
							 | 
						||
| 
								 | 
							
								              , href = $el.data('target') || $el.attr('href')
							 | 
						||
| 
								 | 
							
								              , $href = /^#\w/.test(href) && $(href)
							 | 
						||
| 
								 | 
							
								            return ( $href
							 | 
						||
| 
								 | 
							
								              && href.length
							 | 
						||
| 
								 | 
							
								              && [[ $href.position().top, href ]] ) || null
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								          .sort(function (a, b) { return a[0] - b[0] })
							 | 
						||
| 
								 | 
							
								          .each(function () {
							 | 
						||
| 
								 | 
							
								            self.offsets.push(this[0])
							 | 
						||
| 
								 | 
							
								            self.targets.push(this[1])
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    , process: function () {
							 | 
						||
| 
								 | 
							
								        var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
							 | 
						||
| 
								 | 
							
								          , scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
							 | 
						||
| 
								 | 
							
								          , maxScroll = scrollHeight - this.$scrollElement.height()
							 | 
						||
| 
								 | 
							
								          , offsets = this.offsets
							 | 
						||
| 
								 | 
							
								          , targets = this.targets
							 | 
						||
| 
								 | 
							
								          , activeTarget = this.activeTarget
							 | 
						||
| 
								 | 
							
								          , i
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (scrollTop >= maxScroll) {
							 | 
						||
| 
								 | 
							
								          return activeTarget != (i = targets.last()[0])
							 | 
						||
| 
								 | 
							
								            && this.activate ( 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
							 | 
						||
| 
								 | 
							
								          , selector
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        this.activeTarget = target
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $(this.selector)
							 | 
						||
| 
								 | 
							
								          .parent('.active')
							 | 
						||
| 
								 | 
							
								          .removeClass('active')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        selector = this.selector
							 | 
						||
| 
								 | 
							
								          + '[data-target="' + target + '"],'
							 | 
						||
| 
								 | 
							
								          + this.selector + '[href="' + target + '"]'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        active = $(selector)
							 | 
						||
| 
								 | 
							
								          .parent('li')
							 | 
						||
| 
								 | 
							
								          .addClass('active')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (active.parent('.dropdown-menu'))  {
							 | 
						||
| 
								 | 
							
								          active = active.closest('li.dropdown').addClass('active')
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        active.trigger('activate')
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 /* 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);
							 |