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')
+ })
})