Skip to content

Commit 73c2323

Browse files
authored
fix(click): focus closest focusable (#566) (#567)
* fix(click): focus closest focusable * refactor: remove redundant check
1 parent 7a5c51e commit 73c2323

File tree

2 files changed

+32
-7
lines changed

2 files changed

+32
-7
lines changed

src/__tests__/click.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,3 +442,20 @@ test('calls FocusEvents with relatedTarget', () => {
442442
element0,
443443
)
444444
})
445+
446+
test('move focus to closest focusable element', () => {
447+
const {element} = setup(`
448+
<div tabIndex="0">
449+
<div>this is not focusable</div>
450+
<button>this is focusable</button>
451+
</div>
452+
`)
453+
454+
document.body.focus()
455+
userEvent.click(element.children[1])
456+
expect(element.children[1]).toHaveFocus()
457+
458+
document.body.focus()
459+
userEvent.click(element.children[0])
460+
expect(element).toHaveFocus()
461+
})

src/click.js

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,12 @@ function clickElement(element, init, {clickCount}) {
6161
element,
6262
getMouseEventOptions('mousedown', init, clickCount),
6363
)
64-
if (
65-
continueDefaultHandling &&
66-
element !== element.ownerDocument.activeElement
67-
) {
68-
if (previousElement && !isFocusable(element)) {
64+
if (continueDefaultHandling) {
65+
const closestFocusable = findClosest(element, isFocusable)
66+
if (previousElement && !closestFocusable) {
6967
blur(previousElement, init)
70-
} else {
71-
focus(element, init)
68+
} else if (closestFocusable) {
69+
focus(closestFocusable, init)
7270
}
7371
}
7472
}
@@ -84,6 +82,16 @@ function clickElement(element, init, {clickCount}) {
8482
}
8583
}
8684

85+
function findClosest(el, callback) {
86+
do {
87+
if (callback(el)) {
88+
return el
89+
}
90+
el = el.parentElement
91+
} while (el && el !== document.body)
92+
return undefined
93+
}
94+
8795
function click(element, init, {skipHover = false, clickCount = 0} = {}) {
8896
if (!skipHover) hover(element, init)
8997
switch (element.tagName) {

0 commit comments

Comments
 (0)