哪些HTML元素可以获得焦点?


248

我正在寻找可以集中注意力的HTML元素的最终列表,即在focus()调用它们时哪些元素将成为焦点?

我正在编写一个jQuery扩展,该扩展适用于可以引起关注的元素。我希望这个问题的答案将使我能够具体说明我要针对的要素。

Answers:


337

没有明确的列表,取决于浏览器。我们唯一的标准是DOM Level 2 HTML,根据该标准,唯一具有focus()方法是HTMLInputElement,HTMLSelectElement,HTMLTextAreaElement和HTMLAnchorElement。值得注意的是,这省略了HTMLButtonElement和HTMLAreaElement。

当今的浏览器是focus()在HTMLElement上定义的,但是除非是以下元素之一,否则它实际上不会成为焦点:

  • 带有href的HTMLAnchorElement / HTMLAreaElement
  • HTMLInputElement / HTMLSelectElement / HTMLTextAreaElement / HTMLButtonElement但不支持disabled(如果尝试,IE实际上会给您一个错误),并且出于安全原因文件上传具有异常行为
  • HTMLIFrameElement(尽管集中精力并没有任何用处)。其他嵌入元素也可能尚未全部测试。
  • 任何带有 tabindex

根据浏览器的不同,此行为可能还会有其他细微的例外和补充。


2
我发现了一些有趣的结果:jsfiddle.net/B7gn6建议,我认为在“tabindex属性” ATTRIB是不够的,至少在Chrome工作..
乔恩ž

19
HTML5中标准化了tabindex属性“允许作者控制某个元素是否应该是可焦点的”:w3.org/TR/html5/…基本上,值为0可使该元素成为可焦点的,但其顺序由浏览器决定。
natevw 2014年

7
具有的所有元素element.isContentEditable === true也是可聚焦的。请注意,IE -10(11+?)可以使用显示块或显示表(div,span等)来聚焦任何元素。
记忆

14
tabindex为-1的元素可以通过focus方法以编程方式接收焦点;它只是无法制表。
jessebeach 2015年

5
…除非tabindex为-1,否则将无法进行焦点>>否则,如果tabindex为-1,则可以通过CLICKING进行聚焦,但无法通过按“ tab”进行聚焦。-1使元素具有焦点,只是它没有按Tab键顺序添加。请参阅:jsfiddle.net/0jz0kd1a,首先尝试单击元素,然后将tabindex更改为0并尝试使用tab。
daremkd '16

37

在这里,我有一个基于bobince答案的CSS选择器,用于选择任何可聚焦的HTML元素:

  a[href]:not([tabindex='-1']),
  area[href]:not([tabindex='-1']),
  input:not([disabled]):not([tabindex='-1']),
  select:not([disabled]):not([tabindex='-1']),
  textarea:not([disabled]):not([tabindex='-1']),
  button:not([disabled]):not([tabindex='-1']),
  iframe:not([tabindex='-1']),
  [tabindex]:not([tabindex='-1']),
  [contentEditable=true]:not([tabindex='-1'])
  {
      /* your CSS for focusable elements goes here */
  }

或者在SASS中更漂亮:

a[href],
area[href],
input:not([disabled]),
select:not([disabled]),
textarea:not([disabled]),
button:not([disabled]),
iframe,
[tabindex],
[contentEditable=true]
{
    &:not([tabindex='-1'])
    {
        /* your SCSS for focusable elements goes here */
    }
}

我将其添加为答案,因为那是Google在将我重定向到这个Stackoverflow问题时要寻找的东西。

编辑:还有一个选择器,它是可聚焦的:

[contentEditable=true]

但是,很少使用它。


@TWiStErRob-您的选择器不针对与@ReeCube的选择器相同的元素,因为您的选择器不包含未明确设置tabindex的元素。例如,<a href="foo.html">Bar</a>由于它是一个a具有href属性的元素,因此肯定是可聚焦的。但是您的选择器不包含它。
jbyrd

@jbyrd只是基于bobince的声明而进行的编辑:“…除非tabindex为-1,否则将无法进行焦点。”,它永远都不能取代ReeCube的答案;查看编辑历史记录。
TWiStErRob 2015年

SASS(或CSS)是为上述问题提供严格答案(除非浏览器不一致)的合适形式。
罗伊·廷克

tabindex="-1"没有让一个元素unfocusable,它只是不能用Tab键集中。通过单击它或以编程方式仍然可以获得焦点HTMLElement.focus()。相同的其他任何负数。请参阅:developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/…–
Lazzaro

我不会排除带有tabindex-1的项目。用户将无法通过任何输入设备进行聚焦,但是您可能需要以编程方式设置并仍然显示该聚焦。
James Westgate

7
$focusable:
  'a[href]',
  'area[href]',
  'button',
  'details',
  'input',
  'iframe',
  'select',
  'textarea',

  // these are actually case sensitive but i'm not listing out all the possible variants
  '[contentEditable=""]',
  '[contentEditable="true"]',
  '[contentEditable="TRUE"]',

  '[tabindex]:not([tabindex^="-"])',
  ':not([disabled])';

我正在创建一个包含所有可聚焦元素的SCSS列表,并且由于此问题的Google排名,我认为这可能会对某人有所帮助。

注意事项:

  • 我更改:not([tabindex="-1"])为,:not([tabindex^="-"])因为生成完全合理-2某种方式。比后悔更好安全吗?
  • 添加:not([tabindex^="-"])到所有其他可聚焦选择器是完全没有意义的。使用时,[tabindex]:not([tabindex^="-"])它已经包括了您要否定的所有元素:not
  • :not([disabled])之所以加入,是因为禁用的元素永远无法集中。同样,将其添加到每个元素也没有用。



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.