mirror of
https://github.com/twbs/bootstrap.git
synced 2025-10-03 00:03:44 -04:00
Compare commits
7 Commits
0607f475bf
...
91cd2c687c
Author | SHA1 | Date | |
---|---|---|---|
|
91cd2c687c | ||
|
903707da41 | ||
|
a9b3acc165 | ||
|
d9c14fb359 | ||
|
200d26e792 | ||
|
a7eaa6a8f3 | ||
|
2960896ce4 |
@ -207,6 +207,10 @@ class Dropdown extends BaseComponent {
|
||||
this._element.setAttribute('aria-expanded', 'false')
|
||||
Manipulator.removeDataAttribute(this._menu, 'popper')
|
||||
EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)
|
||||
|
||||
if (this._menu && this._menu.contains(document.activeElement)) {
|
||||
this._element.focus()
|
||||
}
|
||||
}
|
||||
|
||||
_getConfig(config) {
|
||||
|
@ -2097,6 +2097,100 @@ describe('Dropdown', () => {
|
||||
})
|
||||
})
|
||||
|
||||
it('should focus the dropdown trigger when an item is selected (and the dropdown is hidden)', () => {
|
||||
return new Promise(resolve => {
|
||||
fixtureEl.innerHTML = [
|
||||
'<div class="dropdown">',
|
||||
' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>',
|
||||
' <div class="dropdown-menu">',
|
||||
' <a class="dropdown-item" href="#">Some Item</a>',
|
||||
' </div>',
|
||||
'</div>'
|
||||
].join('')
|
||||
|
||||
const toggle = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')
|
||||
const item = fixtureEl.querySelector('.dropdown-item')
|
||||
|
||||
toggle.addEventListener('shown.bs.dropdown', () => {
|
||||
item.focus()
|
||||
item.click()
|
||||
})
|
||||
|
||||
toggle.addEventListener('hidden.bs.dropdown', () => setTimeout(() => {
|
||||
expect(document.activeElement).toEqual(toggle)
|
||||
resolve()
|
||||
}))
|
||||
|
||||
toggle.click()
|
||||
})
|
||||
})
|
||||
|
||||
it('should not focus the dropdown trigger when an item is selected and something else is focused in the hidden event', () => {
|
||||
return new Promise(resolve => {
|
||||
fixtureEl.innerHTML = [
|
||||
'<button class="focus-target"></button>',
|
||||
'<div class="dropdown">',
|
||||
' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>',
|
||||
' <div class="dropdown-menu">',
|
||||
' <a class="dropdown-item" href="#">Some Item</a>',
|
||||
' </div>',
|
||||
'</div>'
|
||||
].join('')
|
||||
|
||||
const toggle = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')
|
||||
const item = fixtureEl.querySelector('.dropdown-item')
|
||||
const focusTarget = fixtureEl.querySelector('.focus-target')
|
||||
|
||||
toggle.addEventListener('shown.bs.dropdown', () => {
|
||||
item.focus()
|
||||
item.click()
|
||||
})
|
||||
|
||||
toggle.addEventListener('hidden.bs.dropdown', () => {
|
||||
focusTarget.focus()
|
||||
setTimeout(() => {
|
||||
expect(document.activeElement).toEqual(focusTarget)
|
||||
expect(document.activeElement).not.toEqual(toggle)
|
||||
resolve()
|
||||
})
|
||||
})
|
||||
|
||||
toggle.click()
|
||||
})
|
||||
})
|
||||
|
||||
it('should not throw an error when the dropdown was disposed in the hidden event', () => {
|
||||
return new Promise(resolve => {
|
||||
fixtureEl.innerHTML = [
|
||||
'<div class="dropdown">',
|
||||
' <button class="btn dropdown-toggle" data-bs-toggle="dropdown">Dropdown</button>',
|
||||
' <div class="dropdown-menu">',
|
||||
' <a class="dropdown-item" href="#">Some Item</a>',
|
||||
' </div>',
|
||||
'</div>'
|
||||
].join('')
|
||||
|
||||
const toggle = fixtureEl.querySelector('[data-bs-toggle="dropdown"]')
|
||||
const item = fixtureEl.querySelector('.dropdown-item')
|
||||
|
||||
toggle.addEventListener('shown.bs.dropdown', () => {
|
||||
item.click()
|
||||
})
|
||||
|
||||
toggle.addEventListener('hidden.bs.dropdown', () => {
|
||||
const dropdown = Dropdown.getInstance(toggle)
|
||||
dropdown.dispose()
|
||||
|
||||
setTimeout(() => {
|
||||
expect(dropdown._menu).toBeNull()
|
||||
resolve()
|
||||
})
|
||||
})
|
||||
|
||||
toggle.click()
|
||||
})
|
||||
})
|
||||
|
||||
it('should close dropdown (only) by clicking inside the dropdown menu when it has data-attribute `data-bs-auto-close="inside"`', () => {
|
||||
return new Promise(resolve => {
|
||||
fixtureEl.innerHTML = [
|
||||
|
Loading…
x
Reference in New Issue
Block a user