assets/javascripts/bootstrap/scrollspy.js
author ymh <ymh.work@gmail.com>
Thu, 15 Jun 2017 12:17:09 +0200
changeset 114 af15590802a4
permissions -rw-r--r--
add a lot of files
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
114
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
/* ========================================================================
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
 * Bootstrap: scrollspy.js v3.3.5
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
 * http://getbootstrap.com/javascript/#scrollspy
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * ========================================================================
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * Copyright 2011-2015 Twitter, Inc.
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 * ======================================================================== */
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
+function ($) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
  'use strict';
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
  // SCROLLSPY CLASS DEFINITION
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
  // ==========================
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
  function ScrollSpy(element, options) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
    this.$body          = $(document.body)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
    this.$scrollElement = $(element).is(document.body) ? $(window) : $(element)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
    this.selector       = (this.options.target || '') + ' .nav li > a'
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
    this.offsets        = []
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
    this.targets        = []
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
    this.activeTarget   = null
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
    this.scrollHeight   = 0
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this))
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
    this.refresh()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
    this.process()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
  ScrollSpy.VERSION  = '3.3.5'
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
  ScrollSpy.DEFAULTS = {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    offset: 10
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
  ScrollSpy.prototype.getScrollHeight = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
    return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
  ScrollSpy.prototype.refresh = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
    var that          = this
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
    var offsetMethod  = 'offset'
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
    var offsetBase    = 0
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
    this.offsets      = []
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
    this.targets      = []
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
    this.scrollHeight = this.getScrollHeight()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
    if (!$.isWindow(this.$scrollElement[0])) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
      offsetMethod = 'position'
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
      offsetBase   = this.$scrollElement.scrollTop()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
    this.$body
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
      .find(this.selector)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
      .map(function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
        var $el   = $(this)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
        var href  = $el.data('target') || $el.attr('href')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
        var $href = /^#./.test(href) && $(href)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
        return ($href
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
          && $href.length
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
          && $href.is(':visible')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
          && [[$href[offsetMethod]().top + offsetBase, href]]) || null
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
      })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
      .sort(function (a, b) { return a[0] - b[0] })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
      .each(function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
        that.offsets.push(this[0])
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
        that.targets.push(this[1])
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
      })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
  ScrollSpy.prototype.process = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
    var scrollHeight = this.getScrollHeight()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
    var maxScroll    = this.options.offset + scrollHeight - this.$scrollElement.height()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
    var offsets      = this.offsets
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
    var targets      = this.targets
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
    var activeTarget = this.activeTarget
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
    var i
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
    if (this.scrollHeight != scrollHeight) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
      this.refresh()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
    if (scrollTop >= maxScroll) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
      return activeTarget != (i = targets[targets.length - 1]) && this.activate(i)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
    if (activeTarget && scrollTop < offsets[0]) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
      this.activeTarget = null
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
      return this.clear()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
    for (i = offsets.length; i--;) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
      activeTarget != targets[i]
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
        && scrollTop >= offsets[i]
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
        && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1])
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
        && this.activate(targets[i])
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
  ScrollSpy.prototype.activate = function (target) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
    this.activeTarget = target
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
    this.clear()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
    var selector = this.selector +
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
      '[data-target="' + target + '"],' +
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
      this.selector + '[href="' + target + '"]'
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
    var active = $(selector)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
      .parents('li')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
      .addClass('active')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
    if (active.parent('.dropdown-menu').length) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
      active = active
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
        .closest('li.dropdown')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
        .addClass('active')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
    }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
    active.trigger('activate.bs.scrollspy')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
  ScrollSpy.prototype.clear = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
    $(this.selector)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
      .parentsUntil(this.options.target, '.active')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
      .removeClass('active')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
  // SCROLLSPY PLUGIN DEFINITION
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
  // ===========================
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
  function Plugin(option) {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
    return this.each(function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
      var $this   = $(this)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
      var data    = $this.data('bs.scrollspy')
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
      var options = typeof option == 'object' && option
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
      if (typeof option == 'string') data[option]()
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
    })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
  var old = $.fn.scrollspy
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
  $.fn.scrollspy             = Plugin
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
  $.fn.scrollspy.Constructor = ScrollSpy
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
  // SCROLLSPY NO CONFLICT
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
  // =====================
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
  $.fn.scrollspy.noConflict = function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
    $.fn.scrollspy = old
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
    return this
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
  }
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
  // SCROLLSPY DATA-API
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
  // ==================
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
  $(window).on('load.bs.scrollspy.data-api', function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
    $('[data-spy="scroll"]').each(function () {
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   167
      var $spy = $(this)
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   168
      Plugin.call($spy, $spy.data())
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   169
    })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   170
  })
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   171
af15590802a4 add a lot of files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   172
}(jQuery);