【问题标题】:Focus outline is invisible in Chrome when using a keydown handler to control focus使用 keydown 处理程序控制焦点时,焦点轮廓在 Chrome 中不可见
【发布时间】:2019-06-11 18:57:06
【问题描述】:

我有一个<input type="text" />

当我从文本字段中 Shift+Tab 时,我想专注于 li > a。在这种情况下,我不能依赖原生选项卡行为,因为我在 <input /> 和目标 <a /> 之间有一个锚元素,我不想关注它。

因此,我添加了一个 keydown 侦听器,将焦点强制集中到我关心的 <a />

然而,在 Chrome 中,当我关注 <input /><input /> 中的 Shift+Tab 时,焦点转到最后一个 <a />,但轮廓不可见。如果我再次执行 Shift+Tab + Tab 以回到 B,我现在可以看到轮廓。

document.getElementById("f").addEventListener("keydown", (e) => {
  if (e.key === "Tab" && e.shiftKey) {
      e.preventDefault();
      document.querySelector("#list1 > li:last-child > a").focus();
  }
});
<ul id="list1">
  <li><a href="#">A</a></li>
  <li><a href="#">B</a></li>
</ul>

<a href="#" />
<input id="f" />

如果我删除 keydown 处理程序和文本字段和我想要聚焦的目标锚点之间的锚元素,焦点轮廓将正确呈现。

这是一个已知的 Chrome 错误,是否有任何解决方法? (使用 Chrome 74)

【问题讨论】:

    标签: javascript google-chrome focus outline


    【解决方案1】:

    您可以使用tabindex 属性防止其他锚获得焦点。这是一个例子:

    <ul id="list1">
      <li><a href="#">A</a></li>
      <li><a href="#">B</a></li>
    </ul>
    
    <a href="#" tabindex="-1"/>
    <input id="f" />

    这可能不适用于所有浏览器。

    【讨论】:

      【解决方案2】:

      您可以考虑删除e.preventDefault();,然后等待几毫秒再设置焦点:

      document.getElementById("f").addEventListener("keydown", function (e) {
          if (e.key === "Tab" && e.shiftKey) {
              setTimeout(function() {
                  document.querySelector("#list1 > li:last-child > a").focus();
              }, 10);
          }
      });
      <ul id="list1">
          <li><a href="#">A</a></li>
          <li><a href="#">B</a></li>
      </ul>
      
      <a href="#" />
      <input id="f" />

      【讨论】:

      • 是的,一个不错的主意,虽然我更喜欢 tabindex 方法
      猜你喜欢
      • 2012-02-29
      • 2023-03-20
      • 2015-03-12
      • 1970-01-01
      • 2013-04-17
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多