Javascript - 当页面中没有元素具有焦点时,将元素聚焦在 keydown 上

标签 javascript focus onkeydown

我有一组按钮。当它们聚焦时,它们会改变颜色。 当用户将鼠标悬停在它们上方或使用向上和向下箭头键时,它们可以获得焦点。

当没有按钮具有焦点时(例如,当用户单击其他位置时),按箭头键会将焦点转移到第一个按钮。至少,这就是我们的意图。

但是,由于我使用相同的键执行不同的操作,因此每当我按下向下键时,焦点就会转到第一个按钮,然后立即转到第二个按钮。

我似乎无法找到一种方法来使这项工作如我所愿。当按下向下箭头键且没有按钮具有焦点时,我可以做些什么来将焦点保持在第一个按钮上?

这就是我正在处理的内容:

var divs = document.getElementsByClassName("blueBtn");
for (var i = 0; i < divs.length; i++) {
    divs[i].addEventListener("keyup", function(event) {
        if (event.keyCode == 38) {
            if (this.previousElementSibling) {
                this.previousElementSibling.focus();
            }
        } else if (event.keyCode == 40) {
            if (this.nextElementSibling) {
                this.nextElementSibling.focus();
            }
        }
    }, false);
    divs[i].addEventListener("mouseover", function(event) {
        this.focus();
    }, false);
}

document.body.addEventListener("keydown", function(event) {
    if (document.body === document.activeElement && (event.keyCode === 38 || event.keyCode === 40)) {
        defaultBtn.focus();
    }
});
.blueBtn {
    display: block;
}

.blueBtn:hover,
.blueBtn:focus {
    background-color: blue;
}
<button id="defaultBtn" class="blueBtn" autofocus>Button 01</button>
<button class="blueBtn">Button 02</button>
<button class="blueBtn">Button 03</button>
<button class="blueBtn">Button 04</button>

最佳答案

肯定还有其他甚至更好的方法来做到这一点,但这是我的建议。我只是使用了一个 bool 变量来跟踪焦点何时来自 body 。

var divs = document.getElementsByClassName("blueBtn");
var fromBody = false;

for (var i = 0; i < divs.length; i++) {
  divs[i].addEventListener("keyup", function(event) {
    if (event.keyCode == 38) {
      if (fromBody) {
        fromBody = false;
        return;
      }
      if (this.previousElementSibling) {
        this.previousElementSibling.focus();
      }
    } else if (event.keyCode == 40) {
      if (fromBody) {
        fromBody = false;
        return;
      }
      if (this.nextElementSibling && !fromBody) {
        this.nextElementSibling.focus();
      }
    }
  }, false);
  divs[i].addEventListener("mouseover", function(event) {
    this.focus();
  }, false);
}

document.body.addEventListener("keydown", function(event) {
  if (document.body === document.activeElement && (event.keyCode === 38 || event.keyCode === 40)) {
    fromBody = true;
    defaultBtn.focus();
  }
});
.blueBtn {
  display: block;
}

.blueBtn:hover,
.blueBtn:focus {
  background-color: blue;
}
<button id="defaultBtn" class="blueBtn" autofocus>Button 01</button>
<button class="blueBtn">Button 02</button>
<button class="blueBtn">Button 03</button>
<button class="blueBtn">Button 04</button>

关于Javascript - 当页面中没有元素具有焦点时,将元素聚焦在 keydown 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54296566/

相关文章:

javascript - jQuery 获取表格单元格中未知元素的值

javascript - 单击 Google map 标记的 ajax 请求后加载 map

php - 保留 Javascript 的页面更新并运行 PHP 代码?

android - 点击外部edittext失去焦点

android - 包含布局中的 NextFocus editText

JavaScript key 处理和浏览器兼容性

javascript - 检查节点值是否存在于 JavaScript 中

java - 在特定的 JTable 单元格上设置焦点和闪烁光标

javascript - 处理 'onkeydown'事件

java - 未检测到短按电源按钮