- `direction`: The direction in which the carousel is sliding (either `"left"` or `"right"`).
- `relatedTarget`: The DOM element that is being slid into place as the active item.
+- `from`: The index of the current item
+- `to`: The index of the next item
All carousel events are fired at the carousel itself (i.e. at the `<div class="carousel">`).
_triggerSlideEvent(relatedTarget, eventDirectionName) {
+ const targetIndex = this._getItemIndex(relatedTarget)
+ const fromIndex = this._getItemIndex($(this._element).find(Selector.ACTIVE_ITEM)[0])
const slideEvent = $.Event(Event.SLIDE, {
relatedTarget,
- direction: eventDirectionName
+ direction: eventDirectionName,
+ from: fromIndex,
+ to: targetIndex
})
$(this._element).trigger(slideEvent)
_slide(direction, element) {
const activeElement = $(this._element).find(Selector.ACTIVE_ITEM)[0]
+ const activeElementIndex = this._getItemIndex(activeElement)
const nextElement = element || activeElement &&
this._getItemByDirection(direction, activeElement)
-
+ const nextElementIndex = this._getItemIndex(nextElement)
const isCycling = Boolean(this._interval)
let directionalClassName
const slidEvent = $.Event(Event.SLID, {
relatedTarget: nextElement,
- direction: eventDirectionName
+ direction: eventDirectionName,
+ from: activeElementIndex,
+ to: nextElementIndex
})
if (Util.supportsTransitionEnd() &&
.bootstrapCarousel('next')
})
+ QUnit.test('should fire slid and slide events with from and to', function (assert) {
+ assert.expect(4)
+ var template = '<div id="myCarousel" class="carousel slide">'
+ + '<div class="carousel-inner">'
+ + '<div class="carousel-item active">'
+ + '<img alt="">'
+ + '<div class="carousel-caption">'
+ + '<h4>First Thumbnail label</h4>'
+ + '</div>'
+ + '</div>'
+ + '<div class="carousel-item">'
+ + '<img alt="">'
+ + '<div class="carousel-caption">'
+ + '<h4>Second Thumbnail label</h4>'
+ + '</div>'
+ + '</div>'
+ + '<div class="carousel-item">'
+ + '<img alt="">'
+ + '<div class="carousel-caption">'
+ + '<h4>Third Thumbnail label</h4>'
+ + '</div>'
+ + '</div>'
+ + '</div>'
+ + '<a class="left carousel-control" href="#myCarousel" data-slide="prev">‹</a>'
+ + '<a class="right carousel-control" href="#myCarousel" data-slide="next">›</a>'
+ + '</div>'
+
+ var done = assert.async()
+ $(template)
+ .on('slid.bs.carousel', function (e) {
+ assert.ok(e.from !== undefined, 'from present')
+ assert.ok(e.to !== undefined, 'to present')
+ $(this).off()
+ done()
+ })
+ .on('slide.bs.carousel', function (e) {
+ assert.ok(e.from !== undefined, 'from present')
+ assert.ok(e.to !== undefined, 'to present')
+ $(this).off('slide.bs.carousel')
+ })
+ .bootstrapCarousel('next')
+ })
+
QUnit.test('should set interval from data attribute', function (assert) {
assert.expect(4)
var templateHTML = '<div id="myCarousel" class="carousel slide">'