使HTML元素不可聚焦


77

是否可以使HTML元素不可聚焦

我了解可以定义一个可以获取焦点的元素列表,并且用户可以通过按一个Tab键来浏览这些元素。我还看到,这取决于浏览器来控制。

但是也许有一种方法可以使某些元素无法聚焦,比如说我希望用户<a>按下a时跳过某个标签Tab



1
这个问题的措词是错误的。它应显示为:“如何使HTML元素不可粘贴?” 这就是原始海报想要的。
ShortFuse

Answers:


107
<a href="http://foo.bar" tabindex="-1">unfocusable</a>

负值表示该元素应是可聚焦的,但不应通过顺序键盘导航来访问。

另请参阅:developer.mozilla.org


1
请记住,数字值小于0是无效的HTML tabindex(尽管我认为在HTML5中有效)。
James Allardice '02

59
请注意,带有负tabindex的元素仍然可以聚焦,只是使用顺序焦点导航(即制表)无法达到。
Alohci 2012年

对于某些元素(例如SVG节点),这在IE中不起作用。有关解决方案,请参见下面的Zohid的答案。
克里斯蒂安·巴拉

1
只是React开发人员的旁注:不要忘记camelCase和方括号:tabIndex = {-1}
e18r

我否决了这个答案,因为这不是问题的确切含义。就我而言,这并没有帮助我。使用<kbd> Tab </ kbd>时,该元素被省略,但仍可以自动聚焦。因此,无论如何要使其变得无法聚焦,我们需要添加disabled属性,正如@Randy的答案中提到的那样。
Dzmitry Alifer '20

27

为了完全避免焦点集中(不只是在使用tab按钮时),还应disabled将其设置为HTML元素中的一个属性。

<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<input class="form-control" type="text"> Click this, you can see it's focusable.

<input class="form-control" type="text" readonly>  Click this, you can see it's focusable.

<input class="form-control" type="text" readonly tabindex="-1">  Click this, you can see it's focusable. Not tab'able.

<input class="form-control" type="text" disabled>  Click this, you can see it's <strong>not</strong> focusable.


3
这不是OP希望实现的目标。您的示例将禁用该文本框。禁用的文本字段与无法聚焦的文本字段不同。他仍然希望使按钮可单击,但是希望他的文本字段在单击按钮时仍然具有焦点。如果某个项目不可聚焦,则通过单击等与之交互将意味着当前聚焦的项目保持聚焦。这就是OP想要实现的目标。
理查德

@Richard我已经给出了使元素变得无法聚焦的示例。由操作员决定他是否接受答案。您描述的内容在HTML规范中是不可能的。否决我的答案会伤害我,因为答案不是一个坏答案,如果您查看赞成的话,会对很多人有所帮助。我希望您不赞成错误的答案,而不要使用显示最佳解决方案的答案。根据您的描述,OP接受的答案也是错误的。请阅读该导览,然后再考虑有关下降投票的问题。
兰迪

这不适用于非input元素-如果我不希望<div>能够获得关注,disabled则无济于事。
Coderer

8

为了防止某个元素获得焦点(“不可聚焦”),您需要使用Javascript来监视focus和防止默认交互。

为了防止将元素制表到选项卡,请使用tabindex=-1属性。

添加tabindex=-1将使任何元素都具有焦点,甚至是div元素。这意味着,当用户单击它时,它可能会获得焦点轮廓,具体取决于浏览器。

理想情况下,您需要这样做:

function preventFocus(event) {
  event.preventDefault();
  if (event.relatedTarget) {
    // Revert focus back to previous blurring element
    event.relatedTarget.focus();
  } else {
    // No previous focus target, blur instead
    event.currentTarget.blur();
  }
}

/* ... */

element.setAttribute('tabindex', '-1');
element.addEventListener('focus', preventFocus);

不幸的是,在滑块上(<input type =“ range”),这使滑块的行为非常不愉快:单击仍然有效,但不能拖动。
Arnaud



1

对于您不想集中在tab上的元素,必须将tabindex设置为负值。


0

如果没有JavaScript,则无法将默认可聚焦的HTML元素设置为不可聚焦的HTML元素。

在深入研究与焦点相关的DOM事件之后,我提出了以下实现(基于@ShortFuse的答案,但修复了一些问题和极端情况):

    // A focus event handler to prevent focusing an element it attached to
    onFocus(event: FocusEvent): void {
        event.preventDefault();

        // Try to remove the focus from this element.
        // This is important to always perform, since just focusing the previously focused element won't work in Edge/FF, if that element is unable to actually get the focus back (became invisible, etc.): the focus would stay on the current element in such a case
        const currentTarget: any | null = event.currentTarget;
        if (currentTarget !== null && isFunction(currentTarget.blur))
            currentTarget.blur();

        // Try to set focus back to the previous element
        const relatedTarget: any | null = event.relatedTarget;
        if (relatedTarget !== null && isFunction(relatedTarget.focus))
            relatedTarget.focus();
    }

   // Not the best implementation, but works for the majority of the real-world cases
    export function isFunction(value: any): value is Function {
        return value instanceof Function;
    }

这是在TypeScript中实现的,但可以很容易地针对纯JavaScript进行调整。


-3

我刚刚在阅读YouTube源代码,看到了focusable =“ false”

<svg xmlns="https://www.w3.org/2000/svg" focusable="false" aria-label="" fill="#4285F4" viewBox="0 0 24 24" height="24" width="24" style="margin-left: 4px; margin-top: 4px;"><path d="M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"></path></svg>

这是一个更正确的答案吗?


如果您使用的是IE和svg元素,请确定为什么不这样做。
Fedor Skrynnikov

它特定于<svg>元素吗?在哪里可以找到此信息?谢谢!
斯潘塞·海莉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.