Answers:
没有明确的列表,取决于浏览器。我们唯一的标准是DOM Level 2 HTML,根据该标准,唯一具有focus()
方法是HTMLInputElement,HTMLSelectElement,HTMLTextAreaElement和HTMLAnchorElement。值得注意的是,这省略了HTMLButtonElement和HTMLAreaElement。
当今的浏览器是focus()
在HTMLElement上定义的,但是除非是以下元素之一,否则它实际上不会成为焦点:
disabled
(如果尝试,IE实际上会给您一个错误),并且出于安全原因文件上传具有异常行为tabindex
根据浏览器的不同,此行为可能还会有其他细微的例外和补充。
element.isContentEditable === true
也是可聚焦的。请注意,IE -10(11+?)可以使用显示块或显示表(div,span等)来聚焦任何元素。
在这里,我有一个基于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]
但是,很少使用它。
<a href="foo.html">Bar</a>
由于它是一个a
具有href
属性的元素,因此肯定是可聚焦的。但是您的选择器不包含它。
tabindex="-1"
并没有让一个元素unfocusable,它只是不能用Tab键集中。通过单击它或以编程方式仍然可以获得焦点HTMLElement.focus()
。相同的其他任何负数。请参阅:developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/…–
$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])
之所以加入,是因为禁用的元素永远无法集中。同样,将其添加到每个元素也没有用。该ally.js无障碍库这里提供了一个非官方的,基于测试的名单:
https://allyjs.io/data-tables/focusable.html
(注意:他们的页面没有说明执行测试的频率。)
也许这可以帮助:
function focus(el){
el.focus();
return el==document.activeElement;
}
返回值:true =成功,false =失败
Reff:https : //developer.mozilla.org/en-US/docs/Web/API/DocumentOrShadowRoot/activeElement https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus