我有一個簡單的實現通過鍵盤輸入的下拉菜單,我使用HTML/CSS和其事件通過JS/jQuery控制。如何將鍵盤焦點設置爲表示列表的父元素
通過鍵盤輔助功能的目標是像這樣:
- 導航下拉通過按標籤鍵菜單元素。
- 按向下箭頭鍵打開專注菜單。
- 在這樣的菜單中,按標籤鍵將幫助您瀏覽菜單元素。
- 在這樣的菜單中,按下esc鍵將關閉下拉菜單。
- 菜單關閉後,將鍵盤焦點保持在菜單的表示父元素上。
這裏是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");
}
});
});
你可以嘗試通過使用'.focus()' – Philip
將焦點設置到父'a'元素上,我很喜歡跳過那個小細節,使其成爲答案@Philip – AGE
只是一個小的評論在這個設計上。 #3不是標準的菜單行爲。您通常使用上/下鍵而不是選項卡在菜單項之間導航。您可以在WAI-ARIA Authoring Practices - http://www.w3上的菜單中看到與鍵盤互動的相當不錯的部分。org/TR/wai-aria-practices /#menu – slugolicious