Material UI Popover - 模拟 keydown 事件的问题

3
任务是使用箭头键而不是TAB/TAB+SHIFT在下拉列表中导航。其中一个想法是替换箭头键的向下事件以模拟TAB/TAB+SHIFT键向下事件。 我的方法归结为以下代码,成功阻止了默认的箭头键事件并触发了显示警报的TAB键代码。
不幸的是,它没有将突出显示移动到所需的列表项,并且除了在文档上触发TAB键事件外什么也没有发生。
有任何想法为什么它不起作用吗?
handleKeyDown = (e) => {
let element  = e.currentTarget;

switch (e.keyCode) {
  case 40:
  e.preventDefault();
  const event = new KeyboardEvent("keydown", { view: window, bubbles: true, cancelable: true, keyCode: 9, shiftKey: false });
  element.dispatchEvent(event);
  break;
}
switch (e.keyCode) {
  case 38:
  e.preventDefault();
  const event = new KeyboardEvent("keydown", { view: window, bubbles: true, cancelable: true, keyCode: 9, shiftKey: true });
  element.dispatchEvent(event);
  break;
}

// the switch case 9 is only used for debugging purposes
     switch (e.keyCode) {
          case 9:
          e.preventDefault();
          alert ("You pressed the 'TAB' key!");
          break;
        }

<Popover onKeyDown={this.handleKeyDown}>

您正在尝试导航哪个元素? - Toumash
首先,如果你想处理不同的情况,请使用单个switch语句进行处理,如下所示:switch (e.keycode) { case 40: // 代码\n case 38: // 代码\n case 9: // 代码\n } - Udaya Prakash
@Toumash 在输入字段和下拉列表的元素列表中 - 就像当前 TAB/TAB+SHIFT 的工作方式一样。 - Nyoques
1个回答

0

由于您正在处理e.keycode==9并阻止该块中的默认事件,

switch (e.keyCode) {
  case 9:
  e.preventDefault();
  alert ("You pressed the 'TAB' key!");
  break;
}

当你在行中按下或释放某个键时触发键9,

const event = new KeyboardEvent("keydown", 
                               { view: window,
                                 bubbles: true,
                                 cancelable: true,
                                 keyCode: 9,
                                 shiftKey: true });

您实际上正在触发块的case 9,其中e.preventDefault()防止其执行默认行为。

解决方案是删除e.preventDefault()用于case 9。但是,当在该元素上按Tab键时,它也会起作用。

建议:使用单个开关和我在上面的评论中提到的许多情况。这是Javascript中switch case的正确语法。


谢谢你的回答,我想我需要在问题中澄清一下 - 与 switch case 9 相关的代码仅是为了显示该代码确实触发了按键按下事件。它不会在最终应用程序中使用。 - Nyoques
假设您没有一个 switch case 9 块,您能否更新问题并尝试使用单个 switch 和多个 cases 进行操作? - Udaya Prakash
我非常确定 switch 语法不是问题,我也尝试过使用 if 语句,结果是一样的 - 尽管它会触发 TAB 键的事件,但它并没有以预期的方式影响弹出列表。 - Nyoques

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接