Roman的答案很有帮助。我进一步创建了处理向上或向下移动焦点的函数。
在组件中,我在onKeyDown事件上调用handleKeyDown函数:
<UnorderedList id='unordered-list' onKeyDown={handleKeyDown} />
为了调用这些函数,我在我的onKeyDown处理程序中使用了如下的if语句:
const handleKeyDown = (e) => {
if(e.key === 'ArrowDown') {
moveFocusDown()
}
if(e.key === 'ArrowUp') {
moveFocusUp()
}
}
接下来是moveFocusDown函数,我完成了以下操作:
const moveFocusDown = () => {
const listItems = document.querySelector('#unordered-list').childNodes
const activeItem = document.activeElement
for(let i = 0; i < listItems.length; i++) {
const listLength = listItems.length
if(activeItem === listItems[i] && activeItem !== listItems[listLength - 1]) {
listItems[i + 1].focus()
}
}
}
条件语句activeItem === listItems[i] && activeItem !== listItems[listLength - 1]
检查当前活动项和无序列表子节点的当前索引是否相同,然后检查节点列表中的最后一个元素不是活动元素。这是为了防止将焦点移动到不存在的元素上。
moveFocus up函数稍微简单一些:
const moveFocusUp = () => {
const listItems = document.querySelector('#menu').childNodes
const activeItem = document.activeElement
for(let i = 0; i < listItems.length; i++) {
if(activeItem === listItems[i] && activeItem !== listItems[0]) {
listItems[i - 1].focus()
}
}
}