【问题标题】:Navigate through multiple lists using arrow keys/jQuery?使用箭头键/jQuery 浏览多个列表?
【发布时间】:2013-11-09 01:47:29
【问题描述】:

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 项目会。

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    我已经修改了您小提琴中的现有代码以使其正常工作:

    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 个不同的 ul,该功能可以正常工作。

    • 在第一次按上/下以及当您想要循环浏览最后/第一个项目时,我必须更改从之前保存的选定 ul 中查找 first()/last(),而不是 lis 的全局列表。

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

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

    【讨论】:

    • 这太好了,谢谢。您是否知道如何解决列表有很多项目并因此滚动的行为?我希望当移动到最终可见的li 时,向下移动会滚动列表。实际上,事实并非如此。我已经分叉了你的例子here
    猜你喜欢
    • 2012-02-12
    • 2011-10-27
    • 1970-01-01
    • 2020-02-15
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多