scrollspy.js 12 KB
Newer Older
Mark Otto's avatar
dist    
Mark Otto committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) :
  typeof define === 'function' && define.amd ? define(['jquery', './util.js'], factory) :
  (global.ScrollSpy = factory(global.jQuery,global.Util));
}(this, (function ($,Util) { 'use strict';

  $ = $ && $.hasOwnProperty('default') ? $['default'] : $;
  Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util;

  function _defineProperties(target, props) {
    for (var i = 0; i < props.length; i++) {
      var descriptor = props[i];
      descriptor.enumerable = descriptor.enumerable || false;
      descriptor.configurable = true;
      if ("value" in descriptor) descriptor.writable = true;
      Object.defineProperty(target, descriptor.key, descriptor);
    }
  }

  function _createClass(Constructor, protoProps, staticProps) {
    if (protoProps) _defineProperties(Constructor.prototype, protoProps);
    if (staticProps) _defineProperties(Constructor, staticProps);
    return Constructor;
  }

  function _defineProperty(obj, key, value) {
    if (key in obj) {
      Object.defineProperty(obj, key, {
        value: value,
        enumerable: true,
        configurable: true,
        writable: true
      });
    } else {
      obj[key] = value;
    }

    return obj;
  }

  function _objectSpread(target) {
    for (var i = 1; i < arguments.length; i++) {
      var source = arguments[i] != null ? arguments[i] : {};
      var ownKeys = Object.keys(source);
Mark Otto's avatar
dist    
Mark Otto committed
45

Mark Otto's avatar
dist    
Mark Otto committed
46
47
48
49
50
      if (typeof Object.getOwnPropertySymbols === 'function') {
        ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
          return Object.getOwnPropertyDescriptor(source, sym).enumerable;
        }));
      }
Mark Otto's avatar
dist    
Mark Otto committed
51

Mark Otto's avatar
dist    
Mark Otto committed
52
53
54
55
      ownKeys.forEach(function (key) {
        _defineProperty(target, key, source[key]);
      });
    }
Mark Otto's avatar
dist    
Mark Otto committed
56

Mark Otto's avatar
dist    
Mark Otto committed
57
58
    return target;
  }
fat's avatar
fat committed
59
60

  /**
Mark Otto's avatar
dist    
Mark Otto committed
61
   * --------------------------------------------------------------------------
Mark Otto's avatar
Mark Otto committed
62
   * Bootstrap (v4.1.3): scrollspy.js
Mark Otto's avatar
dist    
Mark Otto committed
63
64
   * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
   * --------------------------------------------------------------------------
fat's avatar
fat committed
65
   */
Mark Otto's avatar
dist    
Mark Otto committed
66
67

  var ScrollSpy = function ($$$1) {
Mark Otto's avatar
dist    
Mark Otto committed
68
69
    /**
     * ------------------------------------------------------------------------
Mark Otto's avatar
dist    
Mark Otto committed
70
     * Constants
Mark Otto's avatar
dist    
Mark Otto committed
71
72
     * ------------------------------------------------------------------------
     */
Mark Otto's avatar
dist    
Mark Otto committed
73
    var NAME = 'scrollspy';
Mark Otto's avatar
Mark Otto committed
74
    var VERSION = '4.1.3';
Mark Otto's avatar
dist    
Mark Otto committed
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
    var DATA_KEY = 'bs.scrollspy';
    var EVENT_KEY = "." + DATA_KEY;
    var DATA_API_KEY = '.data-api';
    var JQUERY_NO_CONFLICT = $$$1.fn[NAME];
    var Default = {
      offset: 10,
      method: 'auto',
      target: ''
    };
    var DefaultType = {
      offset: 'number',
      method: 'string',
      target: '(string|element)'
    };
    var Event = {
      ACTIVATE: "activate" + EVENT_KEY,
      SCROLL: "scroll" + EVENT_KEY,
      LOAD_DATA_API: "load" + EVENT_KEY + DATA_API_KEY
    };
    var ClassName = {
      DROPDOWN_ITEM: 'dropdown-item',
      DROPDOWN_MENU: 'dropdown-menu',
      ACTIVE: 'active'
    };
    var Selector = {
      DATA_SPY: '[data-spy="scroll"]',
      ACTIVE: '.active',
      NAV_LIST_GROUP: '.nav, .list-group',
      NAV_LINKS: '.nav-link',
      NAV_ITEMS: '.nav-item',
      LIST_ITEMS: '.list-group-item',
      DROPDOWN: '.dropdown',
      DROPDOWN_ITEMS: '.dropdown-item',
      DROPDOWN_TOGGLE: '.dropdown-toggle'
    };
    var OffsetMethod = {
      OFFSET: 'offset',
      POSITION: 'position'
      /**
       * ------------------------------------------------------------------------
       * Class Definition
       * ------------------------------------------------------------------------
       */
fat's avatar
fat committed
118

Mark Otto's avatar
dist    
Mark Otto committed
119
    };
fat's avatar
fat committed
120

Mark Otto's avatar
dist    
Mark Otto committed
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
    var ScrollSpy =
    /*#__PURE__*/
    function () {
      function ScrollSpy(element, config) {
        var _this = this;

        this._element = element;
        this._scrollElement = element.tagName === 'BODY' ? window : element;
        this._config = this._getConfig(config);
        this._selector = this._config.target + " " + Selector.NAV_LINKS + "," + (this._config.target + " " + Selector.LIST_ITEMS + ",") + (this._config.target + " " + Selector.DROPDOWN_ITEMS);
        this._offsets = [];
        this._targets = [];
        this._activeTarget = null;
        this._scrollHeight = 0;
        $$$1(this._scrollElement).on(Event.SCROLL, function (event) {
          return _this._process(event);
        });
        this.refresh();
Jacob Thornton's avatar
Jacob Thornton committed
139

Mark Otto's avatar
dist    
Mark Otto committed
140
141
        this._process();
      } // Getters
fat's avatar
fat committed
142
143


Mark Otto's avatar
dist    
Mark Otto committed
144
      var _proto = ScrollSpy.prototype;
fat's avatar
fat committed
145

Mark Otto's avatar
dist    
Mark Otto committed
146
147
148
      // Public
      _proto.refresh = function refresh() {
        var _this2 = this;
Mark Otto's avatar
dist    
Mark Otto committed
149

Mark Otto's avatar
dist    
Mark Otto committed
150
151
152
153
154
155
156
157
158
159
160
161
162
163
        var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION;
        var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method;
        var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0;
        this._offsets = [];
        this._targets = [];
        this._scrollHeight = this._getScrollHeight();
        var targets = [].slice.call(document.querySelectorAll(this._selector));
        targets.map(function (element) {
          var target;
          var targetSelector = Util.getSelectorFromElement(element);

          if (targetSelector) {
            target = document.querySelector(targetSelector);
          }
164

Mark Otto's avatar
dist    
Mark Otto committed
165
166
          if (target) {
            var targetBCR = target.getBoundingClientRect();
fat's avatar
fat committed
167

Mark Otto's avatar
dist    
Mark Otto committed
168
169
170
171
            if (targetBCR.width || targetBCR.height) {
              // TODO (fat): remove sketch reliance on jQuery position/offset
              return [$$$1(target)[offsetMethod]().top + offsetBase, targetSelector];
            }
Mark Otto's avatar
dist    
Mark Otto committed
172
          }
fat's avatar
fat committed
173

Mark Otto's avatar
dist    
Mark Otto committed
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
          return null;
        }).filter(function (item) {
          return item;
        }).sort(function (a, b) {
          return a[0] - b[0];
        }).forEach(function (item) {
          _this2._offsets.push(item[0]);

          _this2._targets.push(item[1]);
        });
      };

      _proto.dispose = function dispose() {
        $$$1.removeData(this._element, DATA_KEY);
        $$$1(this._scrollElement).off(EVENT_KEY);
        this._element = null;
        this._scrollElement = null;
        this._config = null;
        this._selector = null;
        this._offsets = null;
        this._targets = null;
        this._activeTarget = null;
        this._scrollHeight = null;
      }; // Private
fat's avatar
fat committed
198

Mark Otto's avatar
dist    
Mark Otto committed
199

Mark Otto's avatar
dist    
Mark Otto committed
200
201
      _proto._getConfig = function _getConfig(config) {
        config = _objectSpread({}, Default, typeof config === 'object' && config ? config : {});
fat's avatar
fat committed
202

Mark Otto's avatar
dist    
Mark Otto committed
203
204
        if (typeof config.target !== 'string') {
          var id = $$$1(config.target).attr('id');
fat's avatar
fat committed
205

Mark Otto's avatar
dist    
Mark Otto committed
206
207
208
209
          if (!id) {
            id = Util.getUID(NAME);
            $$$1(config.target).attr('id', id);
          }
Mark Otto's avatar
grunt    
Mark Otto committed
210

Mark Otto's avatar
dist    
Mark Otto committed
211
212
          config.target = "#" + id;
        }
matus's avatar
matus committed
213

Mark Otto's avatar
dist    
Mark Otto committed
214
215
216
        Util.typeCheckConfig(NAME, config, DefaultType);
        return config;
      };
Mark Otto's avatar
grunt    
Mark Otto committed
217

Mark Otto's avatar
dist    
Mark Otto committed
218
219
220
      _proto._getScrollTop = function _getScrollTop() {
        return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop;
      };
fat's avatar
fat committed
221

Mark Otto's avatar
dist    
Mark Otto committed
222
223
224
      _proto._getScrollHeight = function _getScrollHeight() {
        return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight);
      };
fat's avatar
fat committed
225

Mark Otto's avatar
dist    
Mark Otto committed
226
227
228
      _proto._getOffsetHeight = function _getOffsetHeight() {
        return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height;
      };
fat's avatar
fat committed
229

Mark Otto's avatar
dist    
Mark Otto committed
230
231
      _proto._process = function _process() {
        var scrollTop = this._getScrollTop() + this._config.offset;
fat's avatar
fat committed
232

Mark Otto's avatar
dist    
Mark Otto committed
233
        var scrollHeight = this._getScrollHeight();
fat's avatar
fat committed
234

Mark Otto's avatar
dist    
Mark Otto committed
235
        var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight();
Mark Otto's avatar
dist    
Mark Otto committed
236

Mark Otto's avatar
dist    
Mark Otto committed
237
238
        if (this._scrollHeight !== scrollHeight) {
          this.refresh();
Mark Otto's avatar
dist    
Mark Otto committed
239
        }
Mark Otto's avatar
dist    
Mark Otto committed
240

Mark Otto's avatar
dist    
Mark Otto committed
241
242
        if (scrollTop >= maxScroll) {
          var target = this._targets[this._targets.length - 1];
Mark Otto's avatar
dist    
Mark Otto committed
243

Mark Otto's avatar
dist    
Mark Otto committed
244
245
246
          if (this._activeTarget !== target) {
            this._activate(target);
          }
fat's avatar
fat committed
247

Mark Otto's avatar
dist    
Mark Otto committed
248
249
          return;
        }
fat's avatar
fat committed
250

Mark Otto's avatar
dist    
Mark Otto committed
251
252
253
254
        if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) {
          this._activeTarget = null;

          this._clear();
Mark Otto's avatar
dist    
Mark Otto committed
255

Mark Otto's avatar
dist    
Mark Otto committed
256
257
          return;
        }
Mark Otto's avatar
dist    
Mark Otto committed
258

Mark Otto's avatar
dist    
Mark Otto committed
259
        var offsetLength = this._offsets.length;
fat's avatar
fat committed
260

Mark Otto's avatar
dist    
Mark Otto committed
261
262
263
264
265
266
        for (var i = offsetLength; i--;) {
          var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]);

          if (isActiveTarget) {
            this._activate(this._targets[i]);
          }
Mark Otto's avatar
dist    
Mark Otto committed
267
        }
Mark Otto's avatar
dist    
Mark Otto committed
268
      };
Mark Otto's avatar
dist    
Mark Otto committed
269

Mark Otto's avatar
dist    
Mark Otto committed
270
271
      _proto._activate = function _activate(target) {
        this._activeTarget = target;
Mark Otto's avatar
dist    
Mark Otto committed
272

Mark Otto's avatar
dist    
Mark Otto committed
273
        this._clear();
Mark Otto's avatar
dist    
Mark Otto committed
274

Mark Otto's avatar
dist    
Mark Otto committed
275
        var queries = this._selector.split(','); // eslint-disable-next-line arrow-body-style
Mark Otto's avatar
dist    
Mark Otto committed
276
277


Mark Otto's avatar
dist    
Mark Otto committed
278
279
280
281
        queries = queries.map(function (selector) {
          return selector + "[data-target=\"" + target + "\"]," + (selector + "[href=\"" + target + "\"]");
        });
        var $link = $$$1([].slice.call(document.querySelectorAll(queries.join(','))));
Mark Otto's avatar
dist    
Mark Otto committed
282

Mark Otto's avatar
dist    
Mark Otto committed
283
284
285
286
287
288
289
        if ($link.hasClass(ClassName.DROPDOWN_ITEM)) {
          $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE);
          $link.addClass(ClassName.ACTIVE);
        } else {
          // Set triggered link as active
          $link.addClass(ClassName.ACTIVE); // Set triggered links parents as active
          // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor
Mark Otto's avatar
dist    
Mark Otto committed
290

Mark Otto's avatar
dist    
Mark Otto committed
291
          $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_LINKS + ", " + Selector.LIST_ITEMS).addClass(ClassName.ACTIVE); // Handle special case when .nav-link is inside .nav-item
Mark Otto's avatar
dist    
Mark Otto committed
292

Mark Otto's avatar
dist    
Mark Otto committed
293
294
          $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE);
        }
fat's avatar
fat committed
295

Mark Otto's avatar
dist    
Mark Otto committed
296
297
298
299
        $$$1(this._scrollElement).trigger(Event.ACTIVATE, {
          relatedTarget: target
        });
      };
Mark Otto's avatar
grunt    
Mark Otto committed
300

Mark Otto's avatar
dist    
Mark Otto committed
301
302
303
304
      _proto._clear = function _clear() {
        var nodes = [].slice.call(document.querySelectorAll(this._selector));
        $$$1(nodes).filter(Selector.ACTIVE).removeClass(ClassName.ACTIVE);
      }; // Static
Mark Otto's avatar
grunt    
Mark Otto committed
305
306


Mark Otto's avatar
dist    
Mark Otto committed
307
308
309
      ScrollSpy._jQueryInterface = function _jQueryInterface(config) {
        return this.each(function () {
          var data = $$$1(this).data(DATA_KEY);
Mark Otto's avatar
dist    
Mark Otto committed
310

Mark Otto's avatar
dist    
Mark Otto committed
311
          var _config = typeof config === 'object' && config;
Mark Otto's avatar
dist    
Mark Otto committed
312

Mark Otto's avatar
dist    
Mark Otto committed
313
314
315
316
          if (!data) {
            data = new ScrollSpy(this, _config);
            $$$1(this).data(DATA_KEY, data);
          }
Mark Otto's avatar
dist    
Mark Otto committed
317

Mark Otto's avatar
dist    
Mark Otto committed
318
319
320
321
322
323
          if (typeof config === 'string') {
            if (typeof data[config] === 'undefined') {
              throw new TypeError("No method named \"" + config + "\"");
            }

            data[config]();
Mark Otto's avatar
dist    
Mark Otto committed
324
          }
Mark Otto's avatar
dist    
Mark Otto committed
325
326
        });
      };
Mark Otto's avatar
dist    
Mark Otto committed
327

Mark Otto's avatar
dist    
Mark Otto committed
328
329
330
331
      _createClass(ScrollSpy, null, [{
        key: "VERSION",
        get: function get() {
          return VERSION;
Mark Otto's avatar
dist    
Mark Otto committed
332
        }
Mark Otto's avatar
dist    
Mark Otto committed
333
334
335
336
337
338
      }, {
        key: "Default",
        get: function get() {
          return Default;
        }
      }]);
Mark Otto's avatar
dist    
Mark Otto committed
339

Mark Otto's avatar
dist    
Mark Otto committed
340
341
342
343
344
345
346
      return ScrollSpy;
    }();
    /**
     * ------------------------------------------------------------------------
     * Data Api implementation
     * ------------------------------------------------------------------------
     */
fat's avatar
fat committed
347
348


Mark Otto's avatar
dist    
Mark Otto committed
349
350
351
    $$$1(window).on(Event.LOAD_DATA_API, function () {
      var scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY));
      var scrollSpysLength = scrollSpys.length;
Mark Otto's avatar
dist    
Mark Otto committed
352

Mark Otto's avatar
dist    
Mark Otto committed
353
354
      for (var i = scrollSpysLength; i--;) {
        var $spy = $$$1(scrollSpys[i]);
fat's avatar
fat committed
355

Mark Otto's avatar
dist    
Mark Otto committed
356
357
358
359
360
361
362
363
        ScrollSpy._jQueryInterface.call($spy, $spy.data());
      }
    });
    /**
     * ------------------------------------------------------------------------
     * jQuery
     * ------------------------------------------------------------------------
     */
Mark Otto's avatar
dist    
Mark Otto committed
364

Mark Otto's avatar
dist    
Mark Otto committed
365
366
    $$$1.fn[NAME] = ScrollSpy._jQueryInterface;
    $$$1.fn[NAME].Constructor = ScrollSpy;
fat's avatar
fat committed
367

Mark Otto's avatar
dist    
Mark Otto committed
368
369
370
371
    $$$1.fn[NAME].noConflict = function () {
      $$$1.fn[NAME] = JQUERY_NO_CONFLICT;
      return ScrollSpy._jQueryInterface;
    };
Mark Otto's avatar
dist    
Mark Otto committed
372

Mark Otto's avatar
dist    
Mark Otto committed
373
374
    return ScrollSpy;
  }($);
fat's avatar
fat committed
375
376

  return ScrollSpy;
Mark Otto's avatar
dist    
Mark Otto committed
377
378
379

})));
//# sourceMappingURL=scrollspy.js.map