diff options
| author | Johann <[email protected]> | 2016-12-02 18:52:19 +0100 |
|---|---|---|
| committer | Mark Otto <[email protected]> | 2016-12-02 09:52:19 -0800 |
| commit | 297c47c3fdbb58e3d9824afdee83ef3c4b9d141a (patch) | |
| tree | ca90559ff2025eca6400b6b88b3d609d91f9653f /js/src/modal.js | |
| parent | 1fb6d8c46a560e2e35295440721ba2929f9721b6 (diff) | |
| download | bootstrap-297c47c3fdbb58e3d9824afdee83ef3c4b9d141a.tar.xz bootstrap-297c47c3fdbb58e3d9824afdee83ef3c4b9d141a.zip | |
[V4] Throw error when a plugin is in transition (#17823)
* Throw error when a plugin is in transition
* Add unit tests about plugins in transition
Diffstat (limited to 'js/src/modal.js')
| -rw-r--r-- | js/src/modal.js | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/js/src/modal.js b/js/src/modal.js index 61a28dbf5..70bb68e42 100644 --- a/js/src/modal.js +++ b/js/src/modal.js @@ -87,6 +87,7 @@ const Modal = (($) => { this._isShown = false this._isBodyOverflowing = false this._ignoreBackdropClick = false + this._isTransitioning = false this._originalBodyPadding = 0 this._scrollbarWidth = 0 } @@ -110,6 +111,14 @@ const Modal = (($) => { } show(relatedTarget) { + if (this._isTransitioning) { + throw new Error('Modal is transitioning') + } + + if (Util.supportsTransitionEnd() && + $(this._element).hasClass(ClassName.FADE)) { + this._isTransitioning = true + } const showEvent = $.Event(Event.SHOW, { relatedTarget }) @@ -152,8 +161,17 @@ const Modal = (($) => { event.preventDefault() } - const hideEvent = $.Event(Event.HIDE) + if (this._isTransitioning) { + throw new Error('Modal is transitioning') + } + const transition = Util.supportsTransitionEnd() && + $(this._element).hasClass(ClassName.FADE) + if (transition) { + this._isTransitioning = true + } + + const hideEvent = $.Event(Event.HIDE) $(this._element).trigger(hideEvent) if (!this._isShown || hideEvent.isDefaultPrevented()) { @@ -172,9 +190,7 @@ const Modal = (($) => { $(this._element).off(Event.CLICK_DISMISS) $(this._dialog).off(Event.MOUSEDOWN_DISMISS) - if (Util.supportsTransitionEnd() && - $(this._element).hasClass(ClassName.FADE)) { - + if (transition) { $(this._element) .one(Util.TRANSITION_END, (event) => this._hideModal(event)) .emulateTransitionEnd(TRANSITION_DURATION) @@ -240,6 +256,7 @@ const Modal = (($) => { if (this._config.focus) { this._element.focus() } + this._isTransitioning = false $(this._element).trigger(shownEvent) } @@ -287,7 +304,8 @@ const Modal = (($) => { _hideModal() { this._element.style.display = 'none' - this._element.setAttribute('aria-hidden', true) + this._element.setAttribute('aria-hidden', 'true') + this._isTransitioning = false this._showBackdrop(() => { $(document.body).removeClass(ClassName.OPEN) this._resetAdjustments() |
