diff --git a/js/src/toast.js b/js/src/toast.js index 9956fd4064..b29b051ec3 100644 --- a/js/src/toast.js +++ b/js/src/toast.js @@ -90,7 +90,11 @@ class Toast { // Public show() { - EventHandler.trigger(this._element, Event.SHOW) + const showEvent = EventHandler.trigger(this._element, Event.SHOW) + + if (showEvent.defaultPrevented) { + return + } if (this._config.animation) { this._element.classList.add(ClassName.FADE) @@ -126,7 +130,11 @@ class Toast { return } - EventHandler.trigger(this._element, Event.HIDE) + const hideEvent = EventHandler.trigger(this._element, Event.HIDE) + + if (hideEvent.defaultPrevented) { + return + } const complete = () => { this._element.classList.add(ClassName.HIDE) diff --git a/js/tests/unit/toast.js b/js/tests/unit/toast.js index 57f953bd17..234e5955c5 100644 --- a/js/tests/unit/toast.js +++ b/js/tests/unit/toast.js @@ -255,4 +255,75 @@ $(function () { var toast = Toast._getInstance($toast[0]) assert.strictEqual(toast._config.delay, defaultDelay) }) + + QUnit.test('should not trigger shown if show is prevented', function (assert) { + assert.expect(1) + var done = assert.async() + + var toastHtml = + '
' + + '
' + + 'a simple toast' + + '
' + + '
' + + var $toast = $(toastHtml) + .bootstrapToast() + .appendTo($('#qunit-fixture')) + + var shownCalled = false + function assertDone() { + setTimeout(function () { + assert.strictEqual(shownCalled, false) + done() + }, 20) + } + + $toast + .on('show.bs.toast', function (event) { + event.preventDefault() + assertDone() + }) + .on('shown.bs.toast', function () { + shownCalled = true + }) + .bootstrapToast('show') + }) + + QUnit.test('should not trigger hidden if hide is prevented', function (assert) { + assert.expect(1) + var done = assert.async() + + var toastHtml = + '
' + + '
' + + 'a simple toast' + + '
' + + '
' + + var $toast = $(toastHtml) + .bootstrapToast() + .appendTo($('#qunit-fixture')) + + var hiddenCalled = false + function assertDone() { + setTimeout(function () { + assert.strictEqual(hiddenCalled, false) + done() + }, 20) + } + + $toast + .on('shown.bs.toast', function () { + $toast.bootstrapToast('hide') + }) + .on('hide.bs.toast', function (event) { + event.preventDefault() + assertDone() + }) + .on('hidden.bs.toast', function () { + hiddenCalled = true + }) + .bootstrapToast('show') + }) })