jQuery 2.1 |使用箭头键浏览列表中的非连续链接
我想在包含someli中包含的相同类链接的列表中使用箭头键导航,如下所示:jQuery 2.1 |使用箭头键浏览列表中的非连续链接,jquery,hyperlink,html-lists,arrow-keys,Jquery,Hyperlink,Html Lists,Arrow Keys,我想在包含someli中包含的相同类链接的列表中使用箭头键导航,如下所示: <ul> <li class="linkTitle">LINKS BELOW</li> <li class="linkHolder"><a class="link">LINK</a></li> <li class="linkHolder"><a class="link">LINK</a></li&
<ul>
<li class="linkTitle">LINKS BELOW</li>
<li class="linkHolder"><a class="link">LINK</a></li>
<li class="linkHolder"><a class="link">LINK</a></li>
<li class="linkTitle">LINKS BELOW</li>
<li class="linkHolder"><a class="link">LINK</a></li>
<li class="linkHolder"><a class="link">LINK</a></li>
<li class="linkHolder"><a class="link">LINK</a></li>
<li class="linkHolder"><a class="link">LINK</a></li>
</ul>
-
-
-
-
-
-
这是我用Stackoverflow调制的。上面提到的非链接li标准是通过在无序列表之间插入块元素来模拟的。菜单导航基于accesskey功能(accesskey+z);箭头键;制表键(部分);或者老鼠。一旦任何UL高亮显示(聚焦),左箭头键和右箭头键允许在ULs中导航,而上箭头键和下箭头键则可以在高亮显示的UL中的每个元素中导航。我添加了CSS以帮助区分哪些UL/li是重点:
CSS
body {-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;}
p {margin-top:10px;margin-left:4px;}
.ulholder{width:160px;height:200px;background:#AAA}
ul {background:#AAA}
ul.focused {background:#999}
ul:hover, ul:focus, ul:active {background:#999;}
li.selected {background:darkblue}
li:hover, li:focus, li:active {background:orange;}
li:hover a, li:focus a, li:active a {color:white;}
.list{cursor:pointer;}
.link {margin-left:10px;font-weight:bold;text-decoration:none;color:darkblue}
.link:hover, .link:focus, .link:active {color:white;}
.linkfocused {color:white;}
HTML
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<div class="ulholder"><p class="label">List 1</p>
<ul accesskey="z" tabindex="0">
<li class="list"><a href="#" tabindex="-1" class="link">Item 1</a></li>
<li class="list"><a href="#" tabindex="-1" class="link">Item 2</a></li>
<li class="list"><a href="#" tabindex="-1" class="link">Item 3</a></li>
</ul>
<p class="label">List 2</p>
<ul tabindex="0">
<li class="list"><a href="#" tabindex="-1" class="link">Item 1</a></li>
<li class="list"><a href="#" tabindex="-1" class="link">Item 2</a></li>
<li class="list"><a href="#" tabindex="-1" class="link">Item 3</a></li>
</ul>
</div>
在没有任何代码的情况下,tabbing不会这样做吗?@j08691我在这个列表链接数组中避免使用tabIndex,因为我的UI利用了箭头键导航。左右箭头键将在链接容器标题中循环聚焦,而上下箭头键将在这些容器中的链接内容中循环聚焦。我不想在动态添加的列表/链接上维护tabIndex值。
var $liSelected;
var $ulSelected;
$(function(){
$(document).keydown(function(e) {
// Make sure we have a ul selected
if($ulSelected) {
if(e.which === 37) { // left arrow
$('ul').prev().prev().addClass('focused').focus();
}
if(e.which === 39) { // right arrow
$('ul').next().next().addClass('focused').focus();
}
if(e.which === 40) { // down arrow
if($liSelected) {
$liSelected.removeClass('selected');
$liSelected.children('.link').blur();
var $next = $liSelected.next('.list');
if($next.length) {
$liSelected = $next.addClass('selected');
$next.children('.link').focus();
} else {
$liSelected = $ulSelected.children('li').first('.list').addClass('selected');
$ulSelected.children('li').first('.list').children('.link').focus();
}
} else {
$liSelected = $ulSelected.children('li').first('.list').addClass('selected');
$ulSelected.children('li').first('.list').children('.link').focus();
}
} else if(e.which === 38) { // up arrow
if($liSelected) {
$liSelected.removeClass('selected');
$liSelected.children('.link').blur();
var $prev = $liSelected.prev('.list');
if($prev.length) {
$liSelected = $prev.addClass('selected');
$prev.children('.link').focus();
} else {
$liSelected = $ulSelected.children('li').last('.list').addClass('selected');
$ulSelected.children('li').last('.list').children('.link').focus();
}
} else {
$liSelected = $ulSelected.children('li').last('.list').addClass('selected');
$ulSelected.children('li').last('.list').children('.link').focus();
}
}
}
});
$('ul .link').on('click focus', function() {
$('ul').removeClass('focused');
$('ul').find('.list').removeClass('selected');
$('ul').find('.link').removeClass('listfocused');
$(this).parent().addClass('selected');
$(this).parent().parent('ul').addClass('focused');
});
$('ul .list').on('click', function(){
$('.list').removeClass('selected');
$('.link').removeClass('linkfocused');
$(this).addClass('selected');
$(this).children('.link').focus().click().addClass('linkfocused');
});
$('ul').on('focus', function(e) {
$('ul .link').removeClass('linkfocused');
$('ul .list').removeClass('selected');
$('ul').removeClass('focused');
$ulSelected = $(this);
$(this).addClass('focused');
$liSelected = false;
});
});