通过子导航(焦点功能)的 JS / JQuery 键键循环无法按预期工作



对于可访问性,我必须在导航上扩展焦点功能。在焦点上,子导航显示器显示,如果按下向下或向上键,则jQuery将在次级NAV中的项目中循环,同时保持焦点。我几乎已经确定了这一点,但是,jQuery next()无法正常工作,而是以随机顺序跳过两个或有时会跳过。

html: -

<nav class="nav nav--primary" role="navigation">
            <a href="/" title="Home" class="primary-nav-link parent active" data-position="1" tabindex="1">wasd</a>
           <div class="nav__dropdown">
                    <a class="primary-nav-link parent " tabindex="1">wasd</a>
                <span class="nav__expand"></span>
                <div class="nav__dropdown__content" aria-hidden="true">
                        <a href="#" class="sub-nav-link" tabindex="-1" data-position="3.1">wasd</a>
                        <a href="#" class="sub-nav-link" tabindex="-1" data-position="3.2">wasd</a>
                        <a href="#" class="sub-nav-link" tabindex="-1" data-position="3.3">wasd</a>
                        <a href="#" class="sub-nav-link" tabindex="-1" data-position="3.4">wasd</a>
                        <a href="#" class="sub-nav-link" tabindex="-1" data-position="3.5">wasd</a>
                </div>
            </div>
            <div class="nav__dropdown">
                    <a class="primary-nav-link parent " tabindex="1">wasd</a>
                <span class="nav__expand"></span>
                <div class="nav__dropdown__content" aria-hidden="true">
                        <a href="#" class="sub-nav-link" tabindex="-1" data-position="3.1">wasd</a>
                        <a href="#" class="sub-nav-link" tabindex="-1" data-position="3.2">wasd</a>
                        <a href="#" class="sub-nav-link" tabindex="-1" data-position="3.3">wasd</a>
                        <a href="#" class="sub-nav-link" tabindex="-1" data-position="3.4">wasd</a>
                        <a href="#" class="sub-nav-link" tabindex="-1" data-position="3.5">wasd</a>
                </div>
            </div>
             <div class="nav__dropdown">
                    <a class="primary-nav-link parent " tabindex="1">wasd</a>
                <span class="nav__expand"></span>
                <div class="nav__dropdown__content" aria-hidden="true">
                        <a href="#" class="sub-nav-link" tabindex="-1" data-position="3.1">wasd</a>
                        <a href="#" class="sub-nav-link" tabindex="-1" data-position="3.2">wasd</a>
                        <a href="#" class="sub-nav-link" tabindex="-1" data-position="3.3">wasd</a>
                        <a href="#" class="sub-nav-link" tabindex="-1" data-position="3.4">wasd</a>
                        <a href="#" class="sub-nav-link" tabindex="-1" data-position="3.5">wasd</a>
                </div>
            </div>
</nav>

JS: -

   $(".parent").focus(function(){
    $(this).closest(".nav__dropdown").addClass("hover"); 
    $('.hover .nav__dropdown__content a').first().addClass('navSelected');
        $(document).keydown(function(e) {
            var selected = $('.navSelected');
            var sub = $('.hover .nav__dropdown__content a');

            if(e.which === 40){
                if(selected){
                    selected.removeClass('navSelected');
                    next = selected.next();
                        if(next.length > 0){
                            selected = next.addClass('navSelected');
                        }else{
                            selected = sub.eq(0).addClass('navSelected');
                        }
                }else{
                    selected = sub.eq(0).addClass('navSelected');
                }

            }else if(e.which === 38){
                if(selected){
                    selected.removeClass('navSelected');
                    next = selected.prev();
                    if(next.length > 0){
                selected = next.addClass('navSelected');
                    }else{
                        selected = sub.last().addClass('navSelected');
                    }
                }else{
                selected = sub.last().addClass('navSelected');
                }
            }
        });
}).blur(function(){     
    $(".nav__dropdown").removeClass("hover");
    $(document).removeClass("navSelected");
})

工作JS小提琴: -

https://jsfiddle.net/zpnfzevb/

绑定到$(文档)的密钥down事件正在导致额外的循环,这意味着选择最终会在不同的地方出现。

该事件现在绑定到$('nav'),并且在模糊函数中没有绑定,这已删除了任何不需要的触发器,现在行为预期。

最终JS下面: -

  $(".parent").focus(function(){
    $(this).closest(".nav__dropdown").addClass("hover"); 
    $('.hover .nav__dropdown__content a').first().addClass('navSelected');
        $('nav').keydown(function(e) {
            var selected = $('.navSelected');
            var sub = $('.hover .nav__dropdown__content a');

            if(e.which === 40){
                if(selected){
                    selected.removeClass('navSelected');
                    next = selected.next();
                        if(next.length > 0){
                            selected = next.addClass('navSelected');
                        }else{
                            selected = sub.eq(0).addClass('navSelected');
                        }
                }

            }
            if(e.which === 38){
                if(selected){
                    selected.removeClass('navSelected');
                    next = selected.prev();
                        if(next.length > 0){
                            selected = next.addClass('navSelected');
                        }else{
                            selected = sub.last().addClass('navSelected');
                        }
                }
            }
            if(e.which === 13){
                if(selected){
                selected.trigger('click');
                }
            }
        })
  }).blur(function(){
  $('nav').unbind('keydown');
  $(".nav__dropdown").removeClass("hover");
  $(document).removeClass("navSelected");
  })

最新更新