javascript - Svelte:如何在按向上箭头和向下箭头键时将焦点设置到列表项中的上一个/下一个元素?

标签 javascript focus keypress svelte listitem

如何在按向上箭头/向下箭头时将焦点设置到列表项中的上一个/下一个元素 键在 svelte 中?

我想在按下箭头键时将焦点更改为下一个列表项,并在按下键盘上的向上箭头键时将焦点更改为上一个列表项,我已经开始处理一些代码,但它仍然无法正常工作,所以如果有人能帮助我就太好了,在此先感谢

代码:-

<script>
    let keyCode;
    let item;
    
    function handleKeydown() {
        item =  document.getElementsByClassName('item');
        let itemLength = item.length;
        keyCode = event.keyCode;
        
        switch(keyCode){
            //ArrowUp
            case 38:
                //when clicking up arrow focus should move upwards li elements
            break;
            //ArrowDown
            case 40:
                //when clicking down arrow focus should move downwards li elements
            break;
        }   
    }
</script>

<style>
    .item:focus{
        border: 1px solid #000000;
    }
</style>

<svelte:window on:keydown={handleKeydown} />

<ul>
    <li class="item" tabindex="0" >
        <p>List Item 1</p>
    </li>
    <li class="item" tabindex="0" >
        <p>List Item 2</p>
    </li>
    <li class="item" tabindex="0" >
        <p>List Item 3</p>
    </li>
</ul>

最佳答案

给你,在代码中的注释中进行解释,在答案末尾演示 REPL 链接。

<script>
    // dereference the event object, isolating the 'keyCode' property since it's the only one needed
    function handleKeydown({ keyCode }) {
        // we're only interested in handling up & down arrow keys
        if (keyCode !== 38 && keyCode !== 40) return

        // currently focused element (if any)       
        const current = document.activeElement
        // get our collection of list elements and turn it into an actual array
        const items =  [...document.getElementsByClassName('item')]
        // attempt to match the currently focused element to an index in our array of list elements
        const currentIndex = items.indexOf(current)
        // index of the list element to be newly focused
        let newIndex
        
        // if the currently focused element was NOT a list item, then default to focusing the first item in the list (index 0)  
        if (currentIndex === -1) {
            newIndex = 0
        // otherwise, the currently focused element is an item in our list 
        } else {
            // if the UP key has been pressed, set the new index to the current index minus 1, plus the list size, modulo the list size
            if (keyCode === 38) {
                newIndex = (currentIndex + items.length - 1) % items.length
            // if the DOWN key has been pressed, set the new index to the current index plus 1, modulo the list size
            } else {
                newIndex = (currentIndex + 1) % items.length
            }
        }
        
        // blur (= unfocus) the currently focused element (whether it's a list element or not)
        current.blur()
        // focus the list element at the computed index
        items[newIndex].focus()
    }
</script>

Demo REPL

关于javascript - Svelte:如何在按向上箭头和向下箭头键时将焦点设置到列表项中的上一个/下一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63315507/

相关文章:

javascript - 如何根据JavaScript函数的返回值确定转发地址?

javascript - 如何在嵌套方法中引用对象

javascript - 使用 Nodejs 提供图像

java - 为什么focusLost之后会触发其他focusLost?

带有 ImageButton 的 Android 自定义 ListView 没有获得焦点

javascript - Jquery 用换行符填充文本区域,如果没有数据则什么都没有

javascript - ReactJS - 如何在可见后关注组件

c# - KeyPressEventArgs.KeyChar 的值与 ctrl 键

javascript - 将 keydown 事件仅限于字符

c# - 如何将文本写入外部应用程序