使用箭头键/ jQuery导航多个列表?

时间:2013-11-08 16:57:17

标签: javascript jquery

This question有一个有用的答案,展示了如何使用jQuery在列表中上下导航,您可以看到here。代码是这样的:

var li = $('li');
var liSelected;
$(window).keydown(function(e){
    if(e.which === 40){
        if(liSelected){
            liSelected.removeClass('selected');
            next = liSelected.next();
            if(next.length > 0){
                liSelected = next.addClass('selected');
            }else{
                liSelected = li.eq(0).addClass('selected');
            }
        }else{
            liSelected = li.eq(0).addClass('selected');
        }
    }else if(e.which === 38){
        if(liSelected){
            liSelected.removeClass('selected');
            next = liSelected.prev();
            if(next.length > 0){
                liSelected = next.addClass('selected');
            }else{
                liSelected = li.last().addClass('selected');
            }
        }else{
            liSelected = li.last().addClass('selected');
        }
    }
});

我想实现类似的东西,但稍微复杂一点。我将在页面上有多个列表,而不是单个列表。我已将它们设置为可以选中它们。一旦该列表具有焦点,我希望向上/向下箭头键在列表中移动。

我也想了解为什么上面的代码添加/删除类而不是实际使用element.focus();

实现元素焦点

我的HTML标记:

<ul tabindex="0" id="client-list" class="tabbable">
    <li tabindex="-1">Client 1</li>
    <li tabindex="-1">Client 2</li>
</ul>

<ul tabindex="0" id="product-list" class="tabbable">
    <li tabindex="-1">Product 1</li>
    <li tabindex="-1">Product 2</li>
</ul>

我尝试修改keydown函数来测试当前活动的元素:

if ( tabList.hasFocus ) {...

但无济于事。我想这是一个非首发,因为该元素不会有焦点,但子li项将会。

1 个答案:

答案 0 :(得分:2)

我已经修改了你小提琴中的现有代码:

http://jsfiddle.net/path411/8Pku9/

var $liSelected;
var $ulSelected;
$(window).keydown(function(e) {
    // Make sure we have a ul selected
    if($ulSelected) { 

        if(e.which === 40) {            
            if($liSelected) {
                $liSelected.removeClass('selected');
                var $next = $liSelected.next();
                if($next.length) {
                    $liSelected = $next.addClass('selected');
                }
                else {
                    $liSelected = $ulSelected.children('li').first().addClass('selected');  
                }
            }
            else {
                $liSelected = $ulSelected.children('li').first().addClass('selected');            
            }
        }else if(e.which === 38) {            
           if($liSelected) {
                $liSelected.removeClass('selected');
                var $prev = $liSelected.prev();
                if($prev.length) {
                    $liSelected = $prev.addClass('selected');
                }
                else {
                    $liSelected = $ulSelected.children('li').last().addClass('selected');  
                }
            }
            else {
                $liSelected = $ulSelected.children('li').last().addClass('selected');            
            }
        }

    }
});


$('ul').focus(function(e) {
    $ulSelected = $(this);
    $liSelected.removeClass('selected');
    $liSelected = false;
});
  • 需要做的第一件事就是使用$.focus()来保存所关注的ul。

  • .next().prev()已经只对兄弟姐妹有用了,所以通过使用2个不同的uls,这个功能可以正常工作。

  • 首次按下向上/向下以及想要循环显示最后/第一项时,我不得不更改从所选的ul中找到first() / last()之前保存过,而不是lis的全球列表。

  • 在我的编辑中,我确实更改了已保存的jquery元素,以使用以$开头的更常见的语义,这不是必要的更改。

要回答您的其他问题,通过使用类而不是.focus,可以更轻松地跟踪所选元素,并对其进行样式设置。