简体   繁体   English

jQuery如何将第一个按钮集中在lidown键上

[英]Jquery how to focus the first button in a li row on keydown

So I have a list of li rows that each contain buttons. 所以我有一个li行的列表,每个行包含按钮。 I have set it up so I can scroll down the li rows using up and down keys and the buttons using left and right keys. 我已经设置好了,所以我可以使用上下键向下滚动li行,并使用左右键向下滚动按钮。 But I cant seem to figure out how to make it focus the first button each time a new row is selected. 但是我似乎无法弄清楚如何在每次选择新行时使其聚焦于第一个按钮。 So for example, I scroll down the rows, each time i scroll to a new row, the first button in that row should have been focused. 因此,例如,我向下滚动行,每次滚动到新行时,该行中的第一个按钮应该已被选中。

I added $("button").first().focus(); 我添加了$("button").first().focus(); each time down is pressed, but it only focuses the first button of all the buttons and not the first of the current row. 每次按下该按钮时,它仅聚焦所有按钮中的第一个按钮,而不聚焦当前行的第一个按钮。

Here is the complete code im using jsbin 这是使用jsbin的完整代码

button:focus { background:yellow; }
li.selected {background:red}
ul { list-style-type: none; }

<li><button>1</button><button>2</button><button>3</button><button>4</button></li>
<li><button>1</button><button>2</button><button>3</button><button>4</button></li>
<li><button>1</button><button>2</button><button>3</button><button>4</button></li>
<li><button>1</button><button>2</button><button>3</button><button>4</button></li>
<li><button>1</button><button>2</button><button>3</button><button>4</button></li> 


    let el=$('button');
    for(var i = 1; i<=el.length; i++){
      el.eq(i-1).attr('tabindex',i);
    }   

    var li = $('li');
    var liSelected;
    $(window).keydown(function(e){

        if(e.which === 40){
            if(liSelected){
                liSelected.removeClass('selected');
                next = liSelected.next();

        //Focus button 
        $("button").first().focus();

                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');
            }
        }
    });

    $('button').on('keydown', function(event) {
      let currentTabIndex = $(this).attr('tabindex');
      let el = $('button');


    //Focus on categories if at top and up is pressed

      switch (event.which) {
        case 37:
          currentTabIndex = parseInt(currentTabIndex) - 1;
          if (currentTabIndex == 0) {
            $("[tabindex=" + el.length + "]").focus()
          } else {
            $("[tabindex=" + currentTabIndex + "]").focus()
          }
          break;

        case 39:
          currentTabIndex = parseInt(currentTabIndex) + 1;
          if (currentTabIndex == el.length+1) {
            $("[tabindex=" + 1 + "]").focus()
          } else {
          $("[tabindex=" + currentTabIndex + "]").focus()
          }
          break;
      }

    });

Assuming that you want to select the first button everyTime user press up/down, here is the code 假设您想每次用户按下向上/向下按钮时选择第一个按钮,则代码如下

$(window).keydown(function(e){
    var callabackFunction = function (){

  if(liSelected && liSelected.find('button')[0]){
    liSelected.find('button')[0].focus();
  }
    }
    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');
        }
      callabackFunction();
    }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');
        }
      callabackFunction();
    }



});

Edit : - edited the code , will work. 编辑:-编辑了代码,将起作用。 still if you want to select the current row , you need to write the logic for it . 还有,如果要选择当前行,则需要为其编写逻辑。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM