2015-10-08 28 views
0

我有一个简单的实现通过键盘输入的下拉菜单,我使用HTML/CSS和其事件通过JS/jQuery控制。如何将键盘焦点设置为表示列表的父元素

通过键盘辅助功能的目标是像这样:

  1. 导航下拉通过按标签键菜单元素。
  2. 向下箭头键打开专注菜单。
  3. 在这样的菜单中,按标签键将帮助您浏览菜单元素。
  4. 在这样的菜单中,按下esc键将关闭下拉菜单。
  5. 菜单关闭后,将键盘焦点保持在菜单的表示父元素上。

这里是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"); 
     } 
    }); 
}); 
+0

你可以尝试通过使用'.focus()' – Philip

+1

将焦点设置到父'a'元素上,我很喜欢跳过那个小细节,使其成为答案@Philip – AGE

+0

只是一个小的评论在这个设计上。 #3不是标准的菜单行为。您通常使用上/下键而不是选项卡在菜单项之间导航。您可以在WAI-ARIA Authoring Practices - http://www.w3上的菜单中看到与键盘互动的相当不错的部分。org/TR/wai-aria-practices /#menu – slugolicious

回答

1

你可以尝试将焦点设置给母公司a元素,通过使用.focus()

+0

正确!当你浪费时间忽略最小的细节时,你不喜欢它吗?那么你不应该:) – AGE

+0

哈哈我们都一直在那里..一次又一次:) – Philip

相关问题