代码之家  ›  专栏  ›  技术社区  ›  kadina

列表项没有获得焦点,即使我正在使用焦点()。

  •  0
  • kadina  · 技术社区  · 6 年前

    当用户选择键盘上的“M”键时,我需要显示列表并聚焦列表中的第一个列表项。我尝试对列表项调用focus(),但它没有获得焦点或没有显示任何效果。下面是代码。

    HTML:

    <!DOCTYPE html>
    <html>
        <head>
            <title>VOD</title>
            <script src='js/index.js'>
            </script>
            <style>
                html, body {
                    height:100%
                }
    
                #mid {
                    display: flex;
                    height: 100%;
                    width: 100%;
                    justify-content: stretch;
                    flex-flow: row nowrap;
                    z-index: 2;
                }
    
                #mid.hidden {
                    display: none;
                }
    
                #mid1, #mid2 {
                    display: flex;
                    flex: 1;
                    align-items: center;
                }
    
                #mid1 {
                    justify-content: center;
                    background-color: rgba(255, 255, 255, 0.5);
                }
    
                #mid2 {
                    background-color: rgba(255, 255, 255, 0.6);
                }
    
                #ulid {
                    list-style-type: none;
                    width: 100%;
                    margin: 0;
                    border: 0;
                    padding: 0;
                }
    
                .list-item {
                    width: 100%;
                    height: 150px;
                    border-style: solid;
                    border-width: 1px;
                    display:flex;
                    align-items: center;
                    justify-content: flex-start;
                }
    
                li:focus, li:active {
                    background-color: green;
                }
            </style>
        </head>
        <body>
            <video id='vid' src='textMotion.mp4' autoplay loop></video>
            <div id='mid' class='hidden'>
                <div id='mid1'>
                    <h1>TEXT</h1>
                </div>
                <div id='mid2'>
                    <ul id='ulid'></ul>
                </div>
            </div>
        </body>
    </html>
    

    javascript:

    function displayMenu() {
        var mid = document.getElementById('mid');
    
        if(mid.classList.contains('hidden') == false) {
            mid.classList.toggle("hidden");
            let ulid = document.getElementById('ulid');
            while(ulid.firstChild) {
                ulid.removeChild(ulid.firstChild);
            }
            return;
        }
    
        var ulid = document.getElementById('ulid');
    
        for(let index = 0; index < 3; index ++) {
            let lItem = document.createElement('li');
            lItem.classList.add('list-item');
            lItem.setAttribute('id', 'li' + index);
    
            var lineBreak = document.createElement('br');
    
            lItem.appendChild(document.createTextNode('TEXT'));
            lItem.appendChild(lineBreak);
            lItem.appendChild(document.createTextNode('TEXT'));
            ulid.appendChild(lItem);
        }
    
        mid.classList.toggle("hidden");
        document.getElementById('li0').focus();
    }
    
    function changeChannel(e) {
        console.log('received keyEvent : ' + e.keyCode);
        let keyCode = e.keyCode;
    
        if(keyCode == 77) {
            displayMenu();
        }
    }
    
    document.addEventListener('keydown', changeChannel);
    

    即使当用户按“m”时列表会显示出来,列表项也不会集中。

    下面是jsFiddle链接

    https://jsfiddle.net/t75gojd7/

    有人能帮我集中一下列表元素吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   wazz    6 年前

    看起来添加tabindex可能有效。将此添加到属性中。

    lItem.setAttribute('tabindex', index);
    

    这个主意是从 here . 为一些人工作,不是所有人。

        2
  •  1
  •   vatz88    6 年前

    这里所发生的是,你试图聚焦的元素是 div 它不像 button 或A input 文本字段。

    您可以通过按下 div 不释放它。您的CSS样式将被应用。

    我建议改为 :focus CSS类,使用其他一些伪CSS类。或者你可以 event.preventDefault() div 点击.

    引用自 MDN

    如果从mousedown事件处理程序调用htmlelement.focus(),则必须调用event.preventDefault()以防止焦点离开htmlelement。


    还可以查看这个ans Is it possible to focus on a <div> using JavaScript focus() function? 建议增加 tabindex 属性。