From 0263d1742ce8ad25f0f2de30beebae69b2f55f10 Mon Sep 17 00:00:00 2001 From: Alessandro Chitolina Date: Mon, 25 Sep 2017 09:09:01 +0200 Subject: rewritten scrollspy without jquery --- js/src/scrollspy.js | 91 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 53 insertions(+), 38 deletions(-) (limited to 'js/src/scrollspy.js') diff --git a/js/src/scrollspy.js b/js/src/scrollspy.js index e8cd6bf98..ea6d52815 100644 --- a/js/src/scrollspy.js +++ b/js/src/scrollspy.js @@ -5,7 +5,10 @@ * -------------------------------------------------------------------------- */ -import $ from 'jquery' +import Data from './dom/data' +import EventHandler from './dom/eventHandler' +import Manipulator from './dom/manipulator' +import SelectorEngine from './dom/selectorEngine' import Util from './util' /** @@ -19,7 +22,6 @@ const VERSION = '4.3.1' const DATA_KEY = 'bs.scrollspy' const EVENT_KEY = `.${DATA_KEY}` const DATA_API_KEY = '.data-api' -const JQUERY_NO_CONFLICT = $.fn[NAME] const Default = { offset : 10, @@ -81,10 +83,12 @@ class ScrollSpy { this._activeTarget = null this._scrollHeight = 0 - $(this._scrollElement).on(Event.SCROLL, (event) => this._process(event)) + EventHandler.on(this._scrollElement, Event.SCROLL, (event) => this._process(event)) this.refresh() this._process() + + Data.setData(element, DATA_KEY, this) } // Getters @@ -114,7 +118,7 @@ class ScrollSpy { this._scrollHeight = this._getScrollHeight() - const targets = [].slice.call(document.querySelectorAll(this._selector)) + const targets = Util.makeArray(document.querySelectorAll(this._selector)) targets .map((element) => { @@ -130,7 +134,7 @@ class ScrollSpy { if (targetBCR.width || targetBCR.height) { // TODO (fat): remove sketch reliance on jQuery position/offset return [ - $(target)[offsetMethod]().top + offsetBase, + Manipulator[offsetMethod](target).top + offsetBase, targetSelector ] } @@ -146,8 +150,8 @@ class ScrollSpy { } 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 @@ -168,10 +172,10 @@ class ScrollSpy { } if (typeof config.target !== 'string') { - let id = $(config.target).attr('id') + let id = config.target.id if (!id) { id = Util.getUID(NAME) - $(config.target).attr('id', id) + config.target.id = id } config.target = `#${id}` } @@ -242,32 +246,45 @@ class ScrollSpy { this._clear() - const queries = this._selector - .split(',') + const queries = this._selector.split(',') .map((selector) => `${selector}[data-target="${target}"],${selector}[href="${target}"]`) - const $link = $([].slice.call(document.querySelectorAll(queries.join(',')))) + const link = SelectorEngine.findOne(queries.join(',')) + + if (link.classList.contains(ClassName.DROPDOWN_ITEM)) { + SelectorEngine + .findOne(Selector.DROPDOWN_TOGGLE, SelectorEngine.closest(link, Selector.DROPDOWN)) + .classList.add(ClassName.ACTIVE) - if ($link.hasClass(ClassName.DROPDOWN_ITEM)) { - $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE) - $link.addClass(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