Які елементи HTML можуть отримати фокус?


248

Я шукаю остаточний перелік HTML-елементів, яким можна зосередити увагу, тобто які елементи будуть поставлені у фокус, коли focus()буде викликано на них?

Я пишу розширення jQuery, яке працює на елементах, які можна привести у фокус. Я сподіваюся, що відповідь на це питання дозволить мені бути конкретним щодо елементів, на які я орієнтований.

Відповіді:


337

Немає певного списку, це залежить від браузера. Єдиний стандарт, який ми маємо, - це DOM HTML рівня 2 , згідно з яким єдиними елементами, які мають focus()метод, є HTMLInputElement, HTMLSelectElement, HTMLTextAreaElement і HTMLAnchorElement. Це, зокрема, не містить HTMLButtonElement та HTMLAreaElement.

Сьогоднішні браузери визначають focus()HTMLElement, але елемент насправді не зосередиться, якщо це не один із:

  • HTMLAnchorElement / HTMLAreaElement з href
  • HTMLInputElement / HTMLSelectElement / HTMLTextAreaElement / HTMLButtonElement, але не з disabled(IE насправді дає помилку при спробі), і завантаження файлів має незвичну поведінку з міркувань безпеки.
  • HTMLIFrameElement (хоча фокусування не робить нічого корисного). Інші елементи вбудовування також, можливо, я не перевірив їх усіх.
  • Будь-який елемент із a tabindex

Залежно від веб-переглядача, в цій поведінці можуть бути й інші тонкі винятки та доповнення.


2
Я знайшов цікаві результати: jsfiddle.net/B7gn6 пропонує мені, що аттрибу "tabindex" недостатньо для роботи в Chrome принаймні ..
Jon z

19
Те, що атрибут tabindex "дозволяє авторам контролювати, чи повинен елемент бути орієнтованим", стандартизовано в HTML5: w3.org/TR/html5/… В основному значення 0 робить цей елемент орієнтованим, але залишає впорядкованість до браузера .
natevw

7
Усі елементи з element.isContentEditable === trueтакож фокусуються. Зауважте, що IE -10 (11+?) Може фокусувати будь-який елемент із блоком відображення або таблицею (div, span тощо).
пам’яті

14
Елемент з табіндексом -1 може отримувати фокус програмно через метод фокусування; це просто не може бути вкладено до вкладки.
jessebeach

5
… Якщо тільки tabindex не дорівнює -1, це робить фокус неможливим >> не відповідає дійсності, якщо tabindex дорівнює -1, фокусування за допомогою КЛІКУВАННЯ можливе, але фокусування натисканням «вкладки» неможливо. -1 робить елемент орієнтованим, лише він не додається в порядку вкладки. Дивіться: jsfiddle.net/0jz0kd1a , спершу спробуйте натиснути елемент, а потім змінити tabindex на 0 і спробувати скористатися вкладкою.
daremkd

37

Тут у мене є CSS-селектор , заснований на bobince «и відповідь , щоб вибрати будь-який фокусованих 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]

Однак це використовується дуже рідко.


@TWiStErRob - ваш селектор не націлений на ті самі елементи, що і на селектори @ ReeCube, оскільки ваш не містить елементів, у яких явно не встановлено tabindex. Наприклад <a href="foo.html">Bar</a>, безумовно, орієнтований, тому що це aелемент, який має hrefатрибут. Але ваш вибір не включає його.
jbyrd

@jbyrd, це був лише заклик до редагування на основі заяви bobince: "... якщо тільки tabindex не дорівнює -1, це робить фокус неможливим", відповідь ReeCube ніколи не повинен був замінити; переглянути історію редагування.
TWiStErRob

SASS (або CSS) - це підходяща форма для надання чіткої відповіді на вищезазначене питання (невідповідності браузера).
Рой Тінкер

tabindex="-1"це НЕ робить елемент unfocusable, він просто не може бути сфокусований обходом. Він все ще може отримати фокус, натиснувши на нього або програмно за допомогою HTMLElement.focus(); те ж саме для будь-якого іншого від’ємного числа. Дивіться: developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/…
Lazzaro

Я не буду виключати елементи з tabindex-1. Користувачі не зможуть зосередитись на будь-яких пристроях введення, але, можливо, ви захочете програмно встановити та показати цей фокус все-таки.
Джеймс Вестгейт

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])тому що відключені елементи ніколи не можуть бути зосередженими. Тому знову марно додавати його до кожного елемента.


1

Можливо, це може допомогти:

function focus(el){
	el.focus();
	return el==document.activeElement;
}

повернене значення: true = успіх, false = неудача

Посилання: https://developer.mozilla.org/en-US/docs/Web/API/DocumentOrShadowRoot/activeElement https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.