diff options
| author | Patrick H. Lauke <[email protected]> | 2019-06-19 10:23:41 +0100 |
|---|---|---|
| committer | XhmikosR <[email protected]> | 2019-06-19 12:23:41 +0300 |
| commit | f0f75379f661587936fdcf7138fe9805838b7a01 (patch) | |
| tree | f9673b36c0229eb7df0b2546b5587df7767b400d | |
| parent | ceffc3a5fd7af7609150048f0651f025ef19672c (diff) | |
| download | bootstrap-f0f75379f661587936fdcf7138fe9805838b7a01.tar.xz bootstrap-f0f75379f661587936fdcf7138fe9805838b7a01.zip | |
Closing dropdown with ESC correctly sets focus to toggle (#28928)
Just firing the focus event isn't enough ... need to actually call the proper `focus()` method for it to actually do it...
| -rw-r--r-- | js/src/dropdown.js | 2 | ||||
| -rw-r--r-- | js/tests/unit/dropdown.js | 39 |
2 files changed, 40 insertions, 1 deletions
diff --git a/js/src/dropdown.js b/js/src/dropdown.js index 6bae6a4b4..729b64732 100644 --- a/js/src/dropdown.js +++ b/js/src/dropdown.js @@ -486,7 +486,7 @@ class Dropdown { if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) { if (event.which === ESCAPE_KEYCODE) { - EventHandler.trigger(SelectorEngine.findOne(Selector.DATA_TOGGLE, parent), 'focus') + SelectorEngine.findOne(Selector.DATA_TOGGLE, parent).focus() } Dropdown._clearMenus() diff --git a/js/tests/unit/dropdown.js b/js/tests/unit/dropdown.js index 63f83b3bb..ab0fdbd44 100644 --- a/js/tests/unit/dropdown.js +++ b/js/tests/unit/dropdown.js @@ -765,6 +765,45 @@ $(function () { $triggerDropdown[0].dispatchEvent(new Event('click')) }) + QUnit.test('should close dropdown and set focus back to toggle when escape is pressed while focused on a dropdown item', function (assert) { + assert.expect(3) + var done = assert.async() + + var dropdownHTML = '<div class="tabs">' + + '<div class="dropdown">' + + '<a href="#" class="dropdown-toggle" id="toggle" data-toggle="dropdown">Dropdown</a>' + + '<div class="dropdown-menu">' + + '<a class="dropdown-item" id="item" href="#">Menu item</a>' + + '</div>' + + '</div>' + var $dropdown = $(dropdownHTML) + .appendTo('#qunit-fixture') + .find('[data-toggle="dropdown"]') + .bootstrapDropdown() + + var $item = $('#item') + var $toggle = $('#toggle') + + $dropdown + .parent('.dropdown') + .on('shown.bs.dropdown', function () { + // Forcibly focus first item + $item.focus() + assert.ok($(document.activeElement)[0] === $item[0], 'menu item initial focus set') + + // Key escape + var keydown = new Event('keydown') + keydown.which = 27 + $item[0].dispatchEvent(keydown) + + assert.ok(!$dropdown.parent('.dropdown').hasClass('show'), 'dropdown menu was closed after escape') + assert.ok($(document.activeElement)[0] === $toggle[0], 'toggle has focus again once menu was closed after escape') + done() + }) + + $dropdown[0].dispatchEvent(new Event('click')) + }) + QUnit.test('should ignore keyboard events for <input>s and <textarea>s within dropdown-menu, except for escape key', function (assert) { assert.expect(7) var done = assert.async() |
