【问题标题】:List item is not getting focus even though I am using focus()即使我正在使用焦点(),列表项也没有获得焦点
【发布时间】:2018-05-29 03:05:44
【问题描述】:

当用户在键盘上选择键“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/

谁能帮我集中列表元素。

【问题讨论】:

  • 不确定是否可以。这是old link

标签: javascript css html


【解决方案1】:

看起来添加 tabindex 可能会起作用。将此添加到属性中。

lItem.setAttribute('tabindex', index);

here 得到这个想法。为一些人工作,而不是为所有人工作。

【讨论】:

    【解决方案2】:

    这里发生的情况是,您尝试关注的元素是 div,与 buttoninput 文本字段不同,单击后它实际上并没有保持焦点。

    您可以通过按下div 上的指针而不释放它来观察此行为。将应用您的 CSS 样式。

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

    引用MDN

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多