【问题标题】:How to set keyboard focus to a representing parent element of a list如何将键盘焦点设置为列表的代表父元素
【发布时间】:2016-01-06 10:36:58
【问题描述】:

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

通过键盘访问的目的是这样的:

  1. tab 键浏览下拉菜单元素。
  2. 向下箭头键打开一个重点菜单。
  3. 在此类菜单中,按 tab 键 将帮助您浏览菜单元素。
  4. 在此类菜单中,按 esc 键将关闭下拉菜单。
  5. 关闭菜单后,将键盘焦点保持在菜单的代表父元素上。

这是我制作的jsFiddle 作为完全成熟实现的示例。

问题特别在于 jQuery 代码,最后一条语句是我试图确定问题解决方案的地方(请阅读下文)。

我的问题: 如何做到这一点,以便当按下 esc 键关闭下拉菜单;我回到了我第一次通过 向下箭头 键访问下拉菜单元素的下拉菜单父元素?这样做的原因是,在我的实现中,如果我们退出下拉菜单,我们实际上是在要求用户通过 Tab 键找到他们所在的元素。

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

非常感谢任何帮助!

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");
        }
    });
});

【问题讨论】:

  • 您可以尝试使用.focus() 将焦点设置到父级的a 元素
  • 我很震惊,我跳过了这么小的一个细节,让它成为答案@Philip
  • 只是对这个设计的一点评论。 #3 不是标准的菜单行为。您通常使用向上/向下键而不是选项卡在菜单项之间导航。您可以在 WAI-ARIA Authoring Practices - w3.org/TR/wai-aria-practices/#menu 中看到关于键盘与菜单交互的非常好的部分
  • 我完全同意@slugolicious 的观点,对于其他阅读此问题的人来说,这不是我的设计,我必须想出一个非常具体的屏幕阅读器解决方案。但是,如果您发现自己对按键功能的来龙去脉感兴趣,我希望这可以作为一个示例,说明如何按照您的想法进行任何设置。

标签: javascript jquery html css accessibility


【解决方案1】:

您可以尝试使用 .focus() 将焦点设置到父级的 a 元素

【讨论】:

  • 正确!当您浪费时间忽略最小的细节时,您不喜欢它吗?好吧,你不应该:)
猜你喜欢
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 2012-01-05
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
相关资源
最近更新 更多