代码之家  ›  专栏  ›  技术社区  ›  Matt

用向下箭头选择下一个列表项

  •  0
  • Matt  · 技术社区  · 7 年前

    给定一个div列表,我需要能够使用上下箭头键在列表中的项目之间导航,应用 .ag-menu-option-active 类到当前选定的项,并在 Enter 键,触发单击当前选定的列表项。

    我目前可以迭代项目列表,但是在向下箭头上,它只记录列表中的第二个项目。如上所述,用户应该能够上下移动列表,并将活动类应用于当前选定的项。当用户点击 进入 键,应单击关联的列表项。

    let columnMenuItems = document.querySelectorAll('.ag-menu-option');
    document.addEventListener('keydown', e => {
      if (e.key === 'ArrowDown') {
        for (let i = 0; i < columnMenuItems.length; i++) {
          if (columnMenuItems[i].classList.contains('ag-menu-option-active') === true) {
            console.log("MENU OPTION SELECTED: ", columnMenuItems[i + 1])
            columnMenuItems[i].click();
            break;
          }
        }
      }
    });
    

    J小提琴链接: link

    2 回复  |  直到 7 年前
        1
  •  0
  •   Atul    7 年前
    if(columnMenuItems[i+1] !== undefined){
        //add class to next 
        columnMenuItems[i+1].className= "ag-menu-option ag-menu-option-active"
    
        columnMenuItems[i].className= "ag-menu-option"
    }
    

    您可以编写一些其他的逻辑来添加和删除类,但这对于向下箭头是有效的。

        2
  •  0
  •   Nimitt Shah    7 年前

    调用.click()方法时缺少+/- 另外,为了防止未定义的错误,您应该在for循环中首先添加ColumnMenuitems-1。

    代码应该像这样-

    if (e.key === 'ArrowDown') {
        for (let i = 0; i < columnMenuItems.length-1; i++) {
          if (columnMenuItems[i].classList.contains('ag-menu-option-active') === true) {
            console.log("MENU OPTION SELECTED: ", columnMenuItems[i + 1]);
            columnMenuItems[i].classList.remove('ag-menu-option-active');
            columnMenuItems[i + 1].click();
            columnMenuItems[i+1].classList.add('ag-menu-option-active');
            break;
          }
        }
      }
    
      if (e.key === 'ArrowUp') {
        for (let i = columnMenuItems.length - 1; i > 0; i--) {
          //console.log("MENU OPTIONS: ", columnMenuItems[i]);
          if (columnMenuItems[i].classList.contains('ag-menu-option-active') === true) {
            columnMenuItems[i].classList.remove('ag-menu-option-active');
            //if (e.key === 'Enter') {
              columnMenuItems[i - 1].click();
            columnMenuItems[i-1].classList.add('ag-menu-option-active');
            //}
            break;
          }
        }
      }
    

    测试一下 here (jsfiddle)