如何将键盘焦点设置为列表的表示父元素

时间:2015-10-08 17:09:58

标签: javascript jquery html css accessibility

我在下拉菜单列表中通过键盘输入实现了一个简单的可访问性实现,我使用HTML / CSS制作,其事件通过JS / jQuery控制。

通过键盘实现可访问性的目标如下:

  1. 标签键导航下拉菜单元素。
  2. 向下箭头键打开焦点菜单。
  3. 在此菜单中,按标签键将帮助您浏览菜单元素。
  4. 在此菜单中,按 esc 键将关闭下拉菜单。
  5. 关闭菜单后,将键盘焦点保持在菜单的代表父元素上。
  6. 以下是jsFiddle我作为完全成熟实现的示例。

    问题特别在于jQuery代码,最后一个语句是我试图确定问题解决方案的那个(见下文)。

    我的问题: 如何按下 esc 键关闭下拉菜单;我回到下拉菜单中的父元素,我首先通过向下箭头键访问下拉菜单元素?这样做的原因是,在我的实现中,如果我们退出下拉菜单,我们实际上是要求用户选择他们所在的元素。

    这是我试图通过尝试(并且失败)将焦点设置为我刚访问过的父元素来解决的意外行为。

    非常感谢任何帮助!

    HTML

    <ul class="menu">
        <li>
            <a href="#">Menu Elem</a>
            <div class="subMenu">
                <ul>
                    <li>
                        <a href="#">Sub Menu Elem</a>
                    </li>
                    <li>
                        <a href="#">Sub Menu Elem</a>
                    </li>
                    <li>
                        <a href="#">Sub Menu Elem</a>
                    </li>
                </ul>
            </div>
        </li>
        <li>
            <a href="#">Menu Elem</a>
            <div class="subMenu">
                <ul>
                    <li>
                        <a href="#">Sub Menu Elem</a>
                    </li>
                    <li>
                        <a href="#">Sub Menu Elem</a>
                    </li>
                    <li>
                        <a href="#">Sub Menu Elem</a>
                    </li>
                </ul>
            </div>
        </li>
        <li>
            <a href="#">Menu Elem</a>
            <div class="subMenu">
                <ul>
                    <li>
                        <a href="#">Sub Menu Elem</a>
                    </li>
                    <li>
                        <a href="#">Sub Menu Elem</a>
                    </li>
                    <li>
                        <a href="#">Sub Menu Elem</a>
                    </li>
                </ul>
            </div>
        </li>
    </ul>
    

    CSS

    .menu > li {
        display: inline-block;
        text-align: center;
        color: white;
        background-color: orange;
        width: 100px;
        height: 70px;
            position: fixed;
    }
    
    .menu > li:hover {
        cursor: pointer;
    }
    .menu > :nth-child(1) {
        left: 1px;
    }
    .menu > :nth-child(2){
        left: 102px;
    }
    
    .menu > :nth-child(3){
        left: 203px;
    }
    .menu > li > a {
        line-height: 70px;
    }
    .menu > li > .subMenu {
        display: none;
        width: 200px;
        margin-top: 1px;
        outline: 1px solid black;
    }
    .menu > li > .subMenu > ul > li {
        height: 100px;
        background-color: green;
        margin-left: -40px;
        line-height: 100px;
    }
    .menu > li > .subMenu > ul > li:hover {
        background-color: purple;
        cursor: pointer;
    }
    a {
        text-decoration: none;
        color: white;
    }
    

    JS / jQuery的

    $(document).ready(function(){
        var menuElem = $(".menu > li");
    
        $(menuElem).hover(function(){
            $(this).find(".subMenu").toggle();
        });
    
        $(menuElem).keydown(function(e) {
            // down arrow key
            if(e.keyCode === 40 && $(this).find(".subMenu").is(":hidden")){
                $(this).find(".subMenu").toggle();
            }
            // esc key
            else if(e.keyCode === 27 && $(this).find(".subMenu").is(":visible")){
                $(this).find(".subMenu").toggle();
    
                // ***** problematic code here *****
                // Need to target the <a> element, or the <li> element, or the <div>, or the <ul> element, not sure which one will work.
                // Currently: trying to get whichever element represents the selected menu, in the below case the anchor element
    
                $(menuElem).eq($(this).index()).find("a").addClass("selected");
            }
        });
    });
    

1 个答案:

答案 0 :(得分:1)

您可以尝试使用a

将焦点设置为父{q} .focus()元素