代码之家  ›  专栏  ›  技术社区  ›  M T

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

  •  1
  • M T  · 技术社区  · 8 年前

    为了便于访问,我需要在导航上具有扩展的焦点功能。对焦时,子导航显示,如果按下向下或向上键,jquery将在保持对焦的同时循环浏览子导航中的项目。我几乎解决了这个问题,但是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>
    

       $(".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/

    1 回复  |  直到 8 年前
        1
  •  1
  •   M T    8 年前

    绑定到$(document)的keydown事件导致了额外的循环,这意味着选择将在不同的位置结束。

    该事件现在绑定到$('nav')并在blur函数中解除绑定,这已移除任何不需要的触发器,现在行为如预期。

    最终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");
      })