diff --git a/js/src/carousel.js b/js/src/carousel.js index bd5f3d20403b..ed8e2b89a67c 100644 --- a/js/src/carousel.js +++ b/js/src/carousel.js @@ -181,6 +181,8 @@ class Carousel { } if (this._config && this._config.interval && !this._isPaused) { + this._updateInterval() + this._interval = setInterval( (document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval @@ -409,6 +411,23 @@ class Carousel { } } + _updateInterval() { + const element = this._activeElement || SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element) + + if (!element) { + return + } + + const elementInterval = parseInt(element.getAttribute('data-interval'), 10) + + if (elementInterval) { + this._config.defaultInterval = this._config.defaultInterval || this._config.interval + this._config.interval = elementInterval + } else { + this._config.interval = this._config.defaultInterval || this._config.interval + } + } + _slide(direction, element) { const activeElement = SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element) const activeElementIndex = this._getItemIndex(activeElement) @@ -454,6 +473,7 @@ class Carousel { } this._setActiveIndicatorElement(nextElement) + this._activeElement = nextElement if (this._element.classList.contains(CLASS_NAME_SLIDE)) { nextElement.classList.add(orderClassName) @@ -463,14 +483,6 @@ class Carousel { activeElement.classList.add(directionalClassName) nextElement.classList.add(directionalClassName) - const nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10) - if (nextElementInterval) { - this._config.defaultInterval = this._config.defaultInterval || this._config.interval - this._config.interval = nextElementInterval - } else { - this._config.interval = this._config.defaultInterval || this._config.interval - } - const transitionDuration = getTransitionDurationFromElement(activeElement) EventHandler.one(activeElement, TRANSITION_END, () => { diff --git a/js/tests/unit/carousel.spec.js b/js/tests/unit/carousel.spec.js index 61ca52cb2923..a4bd1bac86a5 100644 --- a/js/tests/unit/carousel.spec.js +++ b/js/tests/unit/carousel.spec.js @@ -636,27 +636,24 @@ describe('Carousel', () => { carousel.next() }) - it('should get interval from data attribute in individual item', () => { + it('should update the active element to the next item before sliding', () => { fixtureEl.innerHTML = [ '' ].join('') const carouselEl = fixtureEl.querySelector('#myCarousel') - const carousel = new Carousel(carouselEl, { - interval: 1814 - }) - - expect(carousel._config.interval).toEqual(1814) + const secondItemEl = fixtureEl.querySelector('#secondItem') + const carousel = new Carousel(carouselEl) carousel.next() - expect(carousel._config.interval).toEqual(7) + expect(carousel._activeElement).toEqual(secondItemEl) }) it('should update indicators if present', done => { @@ -876,6 +873,35 @@ describe('Carousel', () => { expect(window.setInterval).toHaveBeenCalled() expect(window.clearInterval).toHaveBeenCalled() }) + + it('should get interval from data attribute on the active item element', () => { + fixtureEl.innerHTML = [ + '' + ].join('') + + const carouselEl = fixtureEl.querySelector('#myCarousel') + const secondItemEl = fixtureEl.querySelector('#secondItem') + const carousel = new Carousel(carouselEl, { + interval: 1814 + }) + + expect(carousel._config.interval).toEqual(1814) + + carousel.cycle() + + expect(carousel._config.interval).toEqual(7) + + carousel._activeElement = secondItemEl + carousel.cycle() + + expect(carousel._config.interval).toEqual(9385) + }) }) describe('to', () => {