Quali elementi HTML possono ricevere il focus?


248

Sto cercando un elenco definitivo di elementi HTML che possono essere messi a fuoco, ovvero quali elementi verranno messi a fuoco quando focus()viene chiamato su di essi?

Sto scrivendo un'estensione jQuery che funziona su elementi che possono essere messi a fuoco. Spero che la risposta a questa domanda mi permetta di essere specifico sugli elementi a cui mi rivolgo.

Risposte:


337

Non esiste un elenco definito, dipende dal browser. L'unico standard che abbiamo è DOM Level 2 HTML , secondo il quale gli unici elementi che hanno un focus()metodo sono HTMLInputElement, HTMLSelectElement, HTMLTextAreaElement e HTMLAnchorElement. Ciò omette in particolare HTMLButtonElement e HTMLAreaElement.

I browser di oggi definiscono focus()HTMLElement, ma un elemento in realtà non si focalizzerà a meno che non sia uno di:

  • HTMLAnchorElement / HTMLAreaElement con un href
  • HTMLInputElement / HTMLSelectElement / HTMLTextAreaElement / HTMLButtonElement ma non con disabled(IE in realtà ti dà un errore se ci provi) e i caricamenti di file hanno un comportamento insolito per motivi di sicurezza
  • HTMLIFrameElement (anche se focalizzarlo non fa nulla di utile). Anche altri elementi di incorporamento, forse, non li ho testati tutti.
  • Qualsiasi elemento con a tabindex

Probabilmente ci saranno altre sottili eccezioni e aggiunte a questo comportamento a seconda del browser.


2
Ho trovato alcuni risultati interessanti: jsfiddle.net/B7gn6 mi suggerisce che l'attributo "tabindex" non è abbastanza per funzionare in Chrome almeno ..
Jon z

19
Il fatto che l'attributo tabindex "consenta agli autori di controllare se un elemento dovrebbe essere focalizzabile" è standardizzato in HTML5: w3.org/TR/html5/… Fondamentalmente, un valore di 0 rende l'elemento focalizzabile ma lascia il suo ordine al browser .
natevw,

7
Tutti gli elementi con element.isContentEditable === truesono anche focalizzabili. Si noti che IE -10 (11+?) Può focalizzare qualsiasi elemento con blocco display o tabella (div, span, ecc.).
mems

14
Un elemento con un tabindex di -1 può ricevere il focus programmaticamente attraverso il metodo focus; semplicemente non può essere tab.
jessebeach,

5
... a meno che il tabindex sia -1, il che rende impossibile la messa a fuoco >> non è vero, se tabindex è -1, la messa a fuoco con CLIC è possibile, ma la messa a fuoco premendo "tab" è impossibile. -1 rende un elemento focalizzabile, solo che non viene aggiunto nell'ordine di tabulazione. Vedi: jsfiddle.net/0jz0kd1a , prima prova a fare clic sull'elemento, quindi cambia tabindex in 0 e prova a usare la scheda.
daremkd,

37

Qui ho un CSS selettore sulla base di bobince 's risposta per selezionare qualsiasi elemento HTML attivabile:

  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 */
  }

o un po 'più bello in 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 */
    }
}

L'ho aggiunto come risposta, perché era quello che stavo cercando, quando Google mi ha reindirizzato a questa domanda StackOverflow.

EDIT: c'è un altro selettore, che è focalizzabile:

[contentEditable=true]

Tuttavia, questo è usato molto raramente.


@TWiStErRob - il tuo selettore non ha come target gli stessi elementi dei selettori di @ ReeCube, perché i tuoi non includono elementi che non hanno un tabindex esplicitamente impostato. Ad esempio <a href="foo.html">Bar</a>è sicuramente focalizzabile perché è un aelemento che ha un hrefattributo. Ma il tuo selettore non lo include.
jbyrd,

@jbyrd che era solo una richiesta di modifica basata sull'affermazione di Bobince: "... a meno che tabindex non sia -1, il che rende impossibile la messa a fuoco", non avrebbe mai dovuto sostituire la risposta di ReeCube; vedere la cronologia delle modifiche.
TWiStErRob,

SASS (o CSS) è un modulo adatto per fornire una risposta rigorosa alla domanda di cui sopra (escludendo le incoerenze del browser).
Roy Tinker,

tabindex="-1"non senza fare un elemento unfocusable, semplicemente non può essere focalizzata da tabulazione. Può ancora ricevere attenzione facendo clic su di esso o programmaticamente con HTMLElement.focus(); lo stesso per qualsiasi altro numero negativo. Vedi: developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/…
Lazzaro

Non escluderei gli articoli con tabindex-1. Gli utenti non saranno in grado di mettere a fuoco tramite alcun dispositivo di input, ma potresti voler impostare a livello di programmazione e mostrare ancora quel focus.
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])';

Sto creando un elenco SCSS di tutti gli elementi focalizzabili e ho pensato che questo potesse aiutare qualcuno a causa del ranking di Google di questa domanda.

Alcune cose da notare:

  • Ho cambiato :not([tabindex="-1"])per :not([tabindex^="-"])perché è perfettamente plausibile per generare -2in qualche modo. Meglio prevenire che curare, vero?
  • L'aggiunta :not([tabindex^="-"])a tutti gli altri selettori focalizzabili è completamente inutile. Quando lo usi [tabindex]:not([tabindex^="-"])include già tutti gli elementi con cui dovresti negare :not!
  • Ho incluso :not([disabled])perché gli elementi disabilitati non possono mai essere focalizzabili. Quindi di nuovo è inutile aggiungerlo a ogni singolo elemento.



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.