diff options
Diffstat (limited to 'js/dist/scrollspy.js')
-rw-r--r-- | js/dist/scrollspy.js | 173 |
1 files changed, 126 insertions, 47 deletions
diff --git a/js/dist/scrollspy.js b/js/dist/scrollspy.js index 7949b9f33d..ca06e1f554 100644 --- a/js/dist/scrollspy.js +++ b/js/dist/scrollspy.js @@ -4,13 +4,15 @@ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ (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 = global || self, global.ScrollSpy = factory(global.jQuery, global.Util)); -}(this, function ($, Util) { 'use strict'; + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./dom/data.js'), require('./dom/eventHandler.js'), require('./dom/manipulator.js'), require('./dom/selectorEngine.js')) : + typeof define === 'function' && define.amd ? define(['./dom/data.js', './dom/eventHandler.js', './dom/manipulator.js', './dom/selectorEngine.js'], factory) : + (global = global || self, global.ScrollSpy = factory(global.Data, global.EventHandler, global.Manipulator, global.SelectorEngine)); +}(this, function (Data, EventHandler, Manipulator, SelectorEngine) { 'use strict'; - $ = $ && $.hasOwnProperty('default') ? $['default'] : $; - Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util; + Data = Data && Data.hasOwnProperty('default') ? Data['default'] : Data; + EventHandler = EventHandler && EventHandler.hasOwnProperty('default') ? EventHandler['default'] : EventHandler; + Manipulator = Manipulator && Manipulator.hasOwnProperty('default') ? Manipulator['default'] : Manipulator; + SelectorEngine = SelectorEngine && SelectorEngine.hasOwnProperty('default') ? SelectorEngine['default'] : SelectorEngine; function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { @@ -63,6 +65,73 @@ } /** + * -------------------------------------------------------------------------- + * Bootstrap (v4.3.1): util/index.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * -------------------------------------------------------------------------- + */ + var MAX_UID = 1000000; + var jQuery = window.jQuery; // Shoutout AngusCroll (https://goo.gl/pxwQGp) + + var toType = function toType(obj) { + return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase(); + }; + /** + * -------------------------------------------------------------------------- + * Public Util Api + * -------------------------------------------------------------------------- + */ + + + var getUID = function getUID(prefix) { + do { + // eslint-disable-next-line no-bitwise + prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here + } while (document.getElementById(prefix)); + + return prefix; + }; + + var getSelectorFromElement = function getSelectorFromElement(element) { + var selector = element.getAttribute('data-target'); + + if (!selector || selector === '#') { + var hrefAttr = element.getAttribute('href'); + selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''; + } + + try { + return document.querySelector(selector) ? selector : null; + } catch (err) { + return null; + } + }; + + var isElement = function isElement(obj) { + return (obj[0] || obj).nodeType; + }; + + var typeCheckConfig = function typeCheckConfig(componentName, config, configTypes) { + Object.keys(configTypes).forEach(function (property) { + var expectedTypes = configTypes[property]; + var value = config[property]; + var valueType = value && isElement(value) ? 'element' : toType(value); + + if (!new RegExp(expectedTypes).test(valueType)) { + throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\".")); + } + }); + }; + + var makeArray = function makeArray(nodeList) { + if (!nodeList) { + return []; + } + + return [].slice.call(nodeList); + }; + + /** * ------------------------------------------------------------------------ * Constants * ------------------------------------------------------------------------ @@ -73,7 +142,6 @@ var DATA_KEY = 'bs.scrollspy'; var EVENT_KEY = "." + DATA_KEY; var DATA_API_KEY = '.data-api'; - var JQUERY_NO_CONFLICT = $.fn[NAME]; var Default = { offset: 10, method: 'auto', @@ -130,12 +198,14 @@ this._targets = []; this._activeTarget = null; this._scrollHeight = 0; - $(this._scrollElement).on(Event.SCROLL, function (event) { + EventHandler.on(this._scrollElement, Event.SCROLL, function (event) { return _this._process(event); }); this.refresh(); this._process(); + + Data.setData(element, DATA_KEY, this); } // Getters @@ -151,13 +221,13 @@ this._offsets = []; this._targets = []; this._scrollHeight = this._getScrollHeight(); - var targets = [].slice.call(document.querySelectorAll(this._selector)); + var targets = makeArray(SelectorEngine.find(this._selector)); targets.map(function (element) { var target; - var targetSelector = Util.getSelectorFromElement(element); + var targetSelector = getSelectorFromElement(element); if (targetSelector) { - target = document.querySelector(targetSelector); + target = SelectorEngine.findOne(targetSelector); } if (target) { @@ -165,7 +235,7 @@ if (targetBCR.width || targetBCR.height) { // TODO (fat): remove sketch reliance on jQuery position/offset - return [$(target)[offsetMethod]().top + offsetBase, targetSelector]; + return [Manipulator[offsetMethod](target).top + offsetBase, targetSelector]; } } @@ -182,8 +252,8 @@ }; _proto.dispose = function dispose() { - $.removeData(this._element, DATA_KEY); - $(this._scrollElement).off(EVENT_KEY); + Data.removeData(this._element, DATA_KEY); + EventHandler.off(this._scrollElement, EVENT_KEY); this._element = null; this._scrollElement = null; this._config = null; @@ -199,17 +269,17 @@ config = _objectSpread({}, Default, typeof config === 'object' && config ? config : {}); if (typeof config.target !== 'string') { - var id = $(config.target).attr('id'); + var id = config.target.id; if (!id) { - id = Util.getUID(NAME); - $(config.target).attr('id', id); + id = getUID(NAME); + config.target.id = id; } config.target = "#" + id; } - Util.typeCheckConfig(NAME, config, DefaultType); + typeCheckConfig(NAME, config, DefaultType); return config; }; @@ -274,28 +344,36 @@ return selector + "[data-target=\"" + target + "\"]," + selector + "[href=\"" + target + "\"]"; }); - var $link = $([].slice.call(document.querySelectorAll(queries.join(',')))); + var link = SelectorEngine.findOne(queries.join(',')); - if ($link.hasClass(ClassName.DROPDOWN_ITEM)) { - $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE); - $link.addClass(ClassName.ACTIVE); + if (link.classList.contains(ClassName.DROPDOWN_ITEM)) { + SelectorEngine.findOne(Selector.DROPDOWN_TOGGLE, SelectorEngine.closest(link, Selector.DROPDOWN)).classList.add(ClassName.ACTIVE); + link.classList.add(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 - - $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 - - $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE); + link.classList.add(ClassName.ACTIVE); + SelectorEngine.parents(link, Selector.NAV_LIST_GROUP).forEach(function (listGroup) { + // Set triggered links parents as active + // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor + SelectorEngine.prev(listGroup, Selector.NAV_LINKS + ", " + Selector.LIST_ITEMS).forEach(function (item) { + return item.classList.add(ClassName.ACTIVE); + }); // Handle special case when .nav-link is inside .nav-item + + SelectorEngine.prev(listGroup, Selector.NAV_ITEMS).forEach(function (navItem) { + SelectorEngine.children(navItem, Selector.NAV_LINKS).forEach(function (item) { + return item.classList.add(ClassName.ACTIVE); + }); + }); + }); } - $(this._scrollElement).trigger(Event.ACTIVATE, { + EventHandler.trigger(this._scrollElement, Event.ACTIVATE, { relatedTarget: target }); }; _proto._clear = function _clear() { - [].slice.call(document.querySelectorAll(this._selector)).filter(function (node) { + makeArray(SelectorEngine.find(this._selector)).filter(function (node) { return node.classList.contains(ClassName.ACTIVE); }).forEach(function (node) { return node.classList.remove(ClassName.ACTIVE); @@ -305,13 +383,12 @@ ScrollSpy._jQueryInterface = function _jQueryInterface(config) { return this.each(function () { - var data = $(this).data(DATA_KEY); + var data = Data.getData(this, DATA_KEY); var _config = typeof config === 'object' && config; if (!data) { data = new ScrollSpy(this, _config); - $(this).data(DATA_KEY, data); } if (typeof config === 'string') { @@ -324,6 +401,10 @@ }); }; + ScrollSpy._getInstance = function _getInstance(element) { + return Data.getData(element, DATA_KEY); + }; + _createClass(ScrollSpy, null, [{ key: "VERSION", get: function get() { @@ -345,15 +426,10 @@ */ - $(window).on(Event.LOAD_DATA_API, function () { - var scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY)); - var scrollSpysLength = scrollSpys.length; - - for (var i = scrollSpysLength; i--;) { - var $spy = $(scrollSpys[i]); - - ScrollSpy._jQueryInterface.call($spy, $spy.data()); - } + EventHandler.on(window, Event.LOAD_DATA_API, function () { + makeArray(SelectorEngine.find(Selector.DATA_SPY)).forEach(function (spy) { + return new ScrollSpy(spy, Manipulator.getDataAttributes(spy)); + }); }); /** * ------------------------------------------------------------------------ @@ -361,13 +437,16 @@ * ------------------------------------------------------------------------ */ - $.fn[NAME] = ScrollSpy._jQueryInterface; - $.fn[NAME].Constructor = ScrollSpy; + if (typeof jQuery !== 'undefined') { + var JQUERY_NO_CONFLICT = jQuery.fn[NAME]; + jQuery.fn[NAME] = ScrollSpy._jQueryInterface; + jQuery.fn[NAME].Constructor = ScrollSpy; - $.fn[NAME].noConflict = function () { - $.fn[NAME] = JQUERY_NO_CONFLICT; - return ScrollSpy._jQueryInterface; - }; + jQuery.fn[NAME].noConflict = function () { + jQuery.fn[NAME] = JQUERY_NO_CONFLICT; + return ScrollSpy._jQueryInterface; + }; + } return ScrollSpy; |