diff options
author | GeoSot <geo.sotis@gmail.com> | 2022-04-21 22:42:17 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-21 22:42:17 +0300 |
commit | 554736834dd929263ab307593f4d4d3f28f61479 (patch) | |
tree | 084f79f074b2e2276ee39ff7ba7b0eb5c4234ad3 /js/src | |
parent | 584600bda36ac13ea325617783216d6c6a331c08 (diff) |
Carousel: Fix not used option (`ride`), simplify `cycle` method (#35983)
* Fix not used option (`ride`) (according to docs), continuing of #35753 a247fe9
* separate concept of `programmatical cycle` vs `maybe cycle after click` functionality
Diffstat (limited to 'js/src')
-rw-r--r-- | js/src/carousel.js | 72 |
1 files changed, 35 insertions, 37 deletions
diff --git a/js/src/carousel.js b/js/src/carousel.js index 7a30beb10e..64f38d7e64 100644 --- a/js/src/carousel.js +++ b/js/src/carousel.js @@ -71,19 +71,19 @@ const KEY_TO_DIRECTION = { const Default = { interval: 5000, keyboard: true, - slide: false, pause: 'hover', - wrap: true, - touch: true + ride: false, + touch: true, + wrap: true } const DefaultType = { interval: '(number|boolean)', keyboard: 'boolean', - slide: '(boolean|string)', + ride: '(boolean|string)', pause: '(string|boolean)', - wrap: 'boolean', - touch: 'boolean' + touch: 'boolean', + wrap: 'boolean' } /** @@ -96,13 +96,16 @@ class Carousel extends BaseComponent { this._interval = null this._activeElement = null - this._stayPaused = false this._isSliding = false this.touchTimeout = null this._swipeHelper = null this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element) this._addEventListeners() + + if (this._config.ride === CLASS_NAME_CAROUSEL) { + this.cycle() + } } // Getters @@ -136,30 +139,32 @@ class Carousel extends BaseComponent { this._slide(ORDER_PREV) } - pause(event) { - if (!event) { - this._stayPaused = true - } - + pause() { if (this._isSliding) { triggerTransitionEnd(this._element) - this.cycle(true) } this._clearInterval() } - cycle(event) { - if (!event) { - this._stayPaused = false - } - + cycle() { this._clearInterval() - if (this._config.interval && !this._stayPaused) { - this._updateInterval() + this._updateInterval() - this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval) + this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval) + } + + _maybeEnableCycle() { + if (!this._config.ride) { + return + } + + if (this._isSliding) { + EventHandler.one(this._element, EVENT_SLID, () => this.cycle()) + return } + + this.cycle() } to(index) { @@ -175,8 +180,6 @@ class Carousel extends BaseComponent { const activeIndex = this._getItemIndex(this._getActive()) if (activeIndex === index) { - this.pause() - this.cycle() return } @@ -205,8 +208,8 @@ class Carousel extends BaseComponent { } if (this._config.pause === 'hover') { - EventHandler.on(this._element, EVENT_MOUSEENTER, event => this.pause(event)) - EventHandler.on(this._element, EVENT_MOUSELEAVE, event => this.cycle(event)) + EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause()) + EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle()) } if (this._config.touch && Swipe.isSupported()) { @@ -237,7 +240,7 @@ class Carousel extends BaseComponent { clearTimeout(this.touchTimeout) } - this.touchTimeout = setTimeout(event => this.cycle(event), TOUCHEVENT_COMPAT_WAIT + this._config.interval) + this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval) } const swipeConfig = { @@ -331,12 +334,10 @@ class Carousel extends BaseComponent { return } - this._isSliding = true - const isCycling = Boolean(this._interval) - if (isCycling) { - this.pause() - } + this.pause() + + this._isSliding = true this._setActiveIndicatorElement(nextElementIndex) this._activeElement = nextElement @@ -420,12 +421,6 @@ class Carousel extends BaseComponent { } data[config]() - return - } - - if (data._config.interval && data._config.ride) { - data.pause() - data.cycle() } }) } @@ -449,15 +444,18 @@ EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (e if (slideIndex) { carousel.to(slideIndex) + carousel._maybeEnableCycle() return } if (Manipulator.getDataAttribute(this, 'slide') === 'next') { carousel.next() + carousel._maybeEnableCycle() return } carousel.prev() + carousel._maybeEnableCycle() }) EventHandler.on(window, EVENT_LOAD_DATA_API, () => { |