【问题标题】:jQuery 2.1.0 | List navigation with arrow keysjQuery 2.1.0 |使用箭头键进行列表导航
【发布时间】:2015-03-23 15:18:01
【问题描述】:

我在键盘箭头键的帮助下在我的应用程序中导航。在我的应用程序中,一些动态设置的元素在列表中垂直显示。到目前为止,下面的代码允许在每个动态设置<li> 中进行水平导航,并在所有动态设置<li> 中进行垂直导航。但是有一个小故障:我似乎无法在所有可用链接中垂直导航(元素目标焦点不是目标链接)。

See FIDDLE for demo

重要提示:您的解决方案必须提供忽略每个 <li> 中元素数量或其类型或类的代码。因此,为了保持代码的简洁和灵活,您的解决方案必须只引用被聚焦的源元素的索引位置,并以与源具有相同索引的目标元素为目标(源元素索引更大比可用的目标元素索引必须以最后一个目标元素为目标):

<ul>
<li><div class="card"><a href="javascript:void(0)" class="card-title">My Card</a><button class="card-export">CE</button><button class="vc-target">CT</button></div></li>
<li><div class="card"><a href="javascript:void(0)" class="card-title">My Card</a><button class="card-export">CE</button><button class="vc-target">CT</button></div></li>
<li><div class="card"><a href="javascript:void(0)" class="card-title">My Card</a><button class="card-export">CE</button><button class="vc-target">CT</button></div></li>
</ul>


$(function(){

$('.card').on('keydown', function(e){

var isfocus = $(this).find('a:focus,button:focus');
var isfocusindex = $(this).find('a:focus,button:focus').index()-1;
var afocus = $(this).find('a:focus');
var bfocuslast = $(this).find('button:last:focus');

if ( e.which == 37 ) { // Left arrowkey
isfocus.prev('button,a').focus();
afocus.parent('div').find('button:last').focus();
}
if ( e.which == 39 ) { // right arrowkey
isfocus.next('button').focus();
bfocuslast.parent('div').find('a:first').focus();
}

if ( e.which == 40 ) { // down arrowkey 
isfocus.parent('div').parent('li').next('li').find('div').find('a:eq('+isfocusindex+'),button:eq('+isfocusindex+')').focus();
}
if ( e.which == 38 ) { // UP arrowkey 
isfocus.parent('div').parent('li').prev('li').find('div').find('a:eq('+isfocusindex+'),button:eq('+isfocusindex+')').focus();
}

});

});

【问题讨论】:

  • "重要提示:您的解决方案必须提供不注意每个
  • 中元素数量或其类型或其类的代码。因此,为了使代码保持最小和灵活,您的解决方案只能参考索引位置”...
  • 嘿,伙计,我们是来帮助您的,而不是为您工作。这样写感觉有点挑战..
  • @urbz 如果我要使用类或其他选择器类型,显然可以解决问题。这就是为什么我强调只使用索引,这样您就不必提供无用的答案。我也帮助别人,所以谢谢你的帮助。
  • 我用最后一个按钮交换了链接,但问题仍然存在。
  • 标签: jquery keyboard-events arrow-keys


    【解决方案1】:

    这是解决我的问题的有效解决方案。对于示例用法,我编写的代码比没有写得更详细:

    WORKING FIDDLE DEMO

    CSS(用于演示目的)

    a:focus, button:focus {color:red}
    a, button {width:55px;}
    UL{display:inline-block}
    ul li{margin-bottom:10px}
    div > a, button{margin-left:20px;}
    

    HTML

    <ul>
    <li><div class="card"><button class="card-export">CE</button><button class="vc-target">CT</button></div></li>
    <li><div class="card"><a href="javascript:void(0)" class="card-title">My Card</a><button class="card-export">CE</button><button class="vc-target">CT</button></div></li>
    <li><div class="card"><button class="card-export">CE</button><a href="javascript:void(0)" class="card-title">My Card</a><button class="vc-target">CT</button><button class="vc-target">CT</button><button class="vc-target">CT</button></div></li>
    <li><div class="card"><button class="card-export">CE</button><button class="vc-target">CT</button><a href="javascript:void(0)" class="card-title">My Card</a></div></li>
    <li><div class="card"><button class="card-export">CE</button><button class="vc-target">CT</button></div></li>
    </ul>
    

    JQUERY

    $(function(){
    
    $('.card').on('keydown', function(e){
    
    var isfocus = $(this).find(':focus');
    var isfocusindex = $(this).find(':focus').index();
    var isfocusbegin = $(this).find('*:first:focus');
    var isfocuslast = $(this).find('*:last:focus');
    var isnexttarget = isfocus.parent('div').parent('li').next('li').find('div').children(':last').index();
    var isprevtarget = isfocus.parent('div').parent('li').prev('li').find('div').children(':last').index();
    var isindexsource = isfocus.index();
    
    if ( e.which == 37 ) { // Left arrowkey
    isfocus.prev().focus();
    isfocusbegin.siblings(':last').focus();
    }
    if ( e.which == 39 ) { // right arrowkey
    isfocus.next().focus();
    isfocuslast.siblings(':first').focus();
    }
    
    if ( e.which == 40 ) { // down arrowkey
    isfocus.parent('div').parent('li').next('li').find('div').children(':eq('+isfocusindex+')').focus();
    if ( isindexsource > isnexttarget ) {
    isfocus.parent('div').parent('li').next('li').find('div').children(':last').focus();        
    }   
    }  
    if ( e.which == 38 ) { // UP arrowkey
    isfocus.parent('div').parent('li').prev('li').find('div').children(':eq('+isfocusindex+')').focus();
    if ( isindexsource > isprevtarget ) {
    isfocus.parent('div').parent('li').prev('li').find('div').children(':last').focus();        
    }
    }
    
    });
    
    });
    

    【讨论】:

    • 我需要你的帮助。请回复。
    • 想在此处应用左右上下键盘导航。 jsfiddle.net/g59onr13/23请帮忙。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签