Какие элементы HTML могут получить фокус?
Я ищу окончательный список HTML-элементов, которые могут принимать фокус, т. е. какие элементы будут помещены в фокус, когда focus() называется на них?
Я пишу расширение jQuery, которое работает на элементах, которые могут быть привлечены в фокус. Я надеюсь, что ответ на этот вопрос позволит мне конкретизировать элементы, на которые я нацелен.
6 ответов:
нет определенного списка, это зависит от браузера. Единственный стандарт у нас есть DOM Level 2 HTML, согласно которому единственные элементы, которые имеют
focus()метод HTMLInputElement, HTMLSelectElement, HTMLTextAreaElement и HTMLAnchorElement. Это заметно опускает HTMLButtonElement и HTMLAreaElement.сегодняшние браузеры определяют
focus()на HTMLElement, но элемент на самом деле не будет принимать фокус, если он не один оф:
- HTMLAnchorElement/HTMLAreaElement с href
- HTMLInputElement/HTMLSelectElement/HTMLTextAreaElement/HTMLButtonElement но не с
disabled(т. е. фактически дает вам ошибку, если вы попытаетесь), и загрузка файлов имеет необычное поведение по соображениям безопасности- HTMLIFrameElement (хотя фокусировка не делает ничего полезного). Другие элементы встраивания также, возможно, я не тестировал их все.
- любой элемент с a
tabindexвероятно, будут и другие тонкие исключения и дополнения к этому поведению в зависимости от браузера.
здесь у меня есть CSS-селектор на основе bobince ' s ответ выбрать любой фокусируемый элемент 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.
EDIT: есть еще один селектор, который фокусируемый:
[contentEditable=true]однако, это используется очень редко.
The союзник.js библиотека специальных возможностей предоставляет неофициальный, тестовый список здесь:
https://allyjs.io/data-tables/focusable.html
(NB: на их странице не указано, как часто выполнялись тесты.)
$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"])to:not([tabindex^="-"])потому что это совершенно правдоподобно, чтобы генерировать-2как-то. Лучше перестраховаться, чем потом жалеть, верно?- добавлять
:not([tabindex^="-"])для всех остальных фокусируемых селекторов это совершенно бессмысленно. При использовании[tabindex]:not([tabindex^="-"])он уже включает в себя все элементы, которые вы бы отрицание с:not!- Я
:not([disabled])потому что отключенные элементы могут никогда быть focusable. Так что опять это бесполезно, чтобы добавить его в каждый отдельный элемент.
может быть, это может помочь:
function focus(el){ el.focus(); return el==document.activeElement; }возвращаемое значение: true = success, false = failed
Reff: https://developer.mozilla.org/en-US/docs/Web/API/DocumentOrShadowRoot/activeElement https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus
селектор :focus разрешен для элементов, которые принимают события клавиатуры или другие пользовательские входы.
Comments