diff options
| author | Pierre Vanduynslager <[email protected]> | 2017-03-18 20:41:13 -0400 |
|---|---|---|
| committer | Mark Otto <[email protected]> | 2017-03-18 17:41:13 -0700 |
| commit | f2f805128508e82f0adc6e57b421dfb46d65a434 (patch) | |
| tree | f09c68d3ad52e8d60c83335a3c2f388ae9d517fd | |
| parent | 5a5ab4c0de0981680fa1764e33967c8d3d4cacf5 (diff) | |
| download | bootstrap-f2f805128508e82f0adc6e57b421dfb46d65a434.tar.xz bootstrap-f2f805128508e82f0adc6e57b421dfb46d65a434.zip | |
Fix backdrop for dropdown menu on mobile (#21578)
- Create backdrop only if the menu is actually open (do not create it if the show event is prevented)
- Drop the backdrop only when the corresponding menu is closed (do not remove if there is no menu to close or if the hide event is prevented)
| -rw-r--r-- | js/src/dropdown.js | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/js/src/dropdown.js b/js/src/dropdown.js index 1660d4257..644273a0a 100644 --- a/js/src/dropdown.js +++ b/js/src/dropdown.js @@ -97,16 +97,6 @@ const Dropdown = (($) => { return false } - if ('ontouchstart' in document.documentElement && - !$(parent).closest(Selector.NAVBAR_NAV).length) { - - // if mobile we use a backdrop because click events don't delegate - const dropdown = document.createElement('div') - dropdown.className = ClassName.BACKDROP - $(dropdown).insertBefore(this) - $(dropdown).on('click', Dropdown._clearMenus) - } - const relatedTarget = { relatedTarget : this } @@ -118,6 +108,17 @@ const Dropdown = (($) => { return false } + // set the backdrop only if the dropdown menu will be opened + if ('ontouchstart' in document.documentElement && + !$(parent).closest(Selector.NAVBAR_NAV).length) { + + // if mobile we use a backdrop because click events don't delegate + const dropdown = document.createElement('div') + dropdown.className = ClassName.BACKDROP + $(dropdown).insertBefore(this) + $(dropdown).on('click', Dropdown._clearMenus) + } + this.focus() this.setAttribute('aria-expanded', true) @@ -166,11 +167,6 @@ const Dropdown = (($) => { return } - const backdrop = $(Selector.BACKDROP)[0] - if (backdrop) { - backdrop.parentNode.removeChild(backdrop) - } - const toggles = $.makeArray($(Selector.DATA_TOGGLE)) for (let i = 0; i < toggles.length; i++) { @@ -195,6 +191,12 @@ const Dropdown = (($) => { continue } + // remove backdrop only if the dropdown menu will be hidden + const backdrop = $(parent).find(Selector.BACKDROP)[0] + if (backdrop) { + backdrop.parentNode.removeChild(backdrop) + } + toggles[i].setAttribute('aria-expanded', 'false') $(parent) |
