JavaScriptDOM i zdarzenia

HTMLElement.focus()

Ustawia fokus na elemencie, np. polu formularza, żeby od razu odbierał klawiaturę. Metoda blur() zdejmuje fokus.

Zwraca
undefined
Na tej stronie

Przykład

#
JavaScript
const email = document.querySelector('#email')

email.focus()
console.log(document.activeElement === email)
console.log(document.activeElement.id)

email.blur()
console.log(document.activeElement === document.body)
Wynik
true
email
true

Ten przykład nie uruchamia się w podglądzie, bo przeniósłby fokus z tej strony do ramki z przykładem. Na stronie z polem <input id="email"> wypisuje wynik pokazany powyżej. Po blur() fokus wraca do dokumentu, a document.activeElement wskazuje <body>.

Definicja i zastosowanie

#

Metoda focus() przenosi fokus na element, czyli sprawia, że to on odbiera wciśnięcia klawiszy. Pole tekstowe z fokusem pokazuje migający kursor, a przycisk z fokusem zareaguje na Enter i spację. Metoda blur() działa odwrotnie i zdejmuje fokus. Element, który aktualnie ma fokus, odczytasz z document.activeElement.

Fokus mogą dostać elementy interaktywne: pola formularzy, przyciski, linki z atrybutem href oraz elementy z atrybutem tabindex. Wywołanie focus() na zwykłym div czy nagłówku nic nie zrobi, chyba że dodasz mu tabindex="-1". Taki element można aktywować z kodu, ale nie trafia on do kolejności przechodzenia klawiszem Tab.

Przy zmianie fokusu element dostaje zdarzenia focus i blur, które nie bąbelkują, oraz focusin i focusout, które bąbelkują i nadają się do delegowania. Domyślnie przeglądarka przewija stronę tak, żeby element z fokusem był widoczny. Opcja preventScroll: true wyłącza to przewijanie.

Przemyślane użycie focus() poprawia dostępność: po otwarciu okna dialogowego przenieś fokus do jego pierwszego pola, po zamknięciu wróć na przycisk, który je otworzył, a po nieudanym wysłaniu formularza wskaż pierwsze błędne pole. Nie przenoś jednak fokusu bez wyraźnego powodu, bo osoby korzystające z klawiatury i czytników ekranu tracą wtedy orientację.

Składnia

#
Składnia
element.focus()
element.focus(options)
element.blur()

document.activeElement

Parametry

#
  • options

    opcjonalny obiekt

    preventScroll: true ustawia fokus bez przewijania strony do elementu.

Więcej przykładów

#
Fokus po kliknięciu przycisku
JavaScript
const reply = document.querySelector('#reply')
const comment = document.querySelector('#comment')

reply.addEventListener('click', () => comment.focus())
comment.addEventListener('focus', () => console.log('Pole komentarza aktywne'))
comment.addEventListener('blur', () => console.log('Pole komentarza nieaktywne'))

console.log('Aktywny element:', document.activeElement)
Konsola
Aktywny element: <body>

Na starcie fokus ma sam dokument, czyli <body>. Kliknij „Odpowiedz”, a fokus przejdzie do pola komentarza. Potem kliknij obok pola, żeby zobaczyć zdarzenie blur.

Fokus na nagłówku po wczytaniu lekcji
JavaScript
const heading = document.querySelector('#lesson-title')

heading.setAttribute('tabindex', '-1')
heading.focus({ preventScroll: true })

console.log(document.activeElement.tagName)
console.log(heading.tabIndex)
Wynik
H2
-1

Na stronie z nagłówkiem <h2 id="lesson-title"> nagłówek normalnie nie przyjmuje fokusu. tabindex="-1" pozwala aktywować go z kodu, np. po wczytaniu nowej lekcji, dzięki czemu czytnik ekranu od razu odczyta jej tytuł. Element nie trafia przy tym do kolejności klawisza Tab.

Obsługa przeglądarek

#

Szeroko dostępne

Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.

  • Chrome
  • Edge
  • Firefox
  • Safari

Dobre praktyki

#
  • Po otwarciu okna dialogowego przenieś fokus do niego, a po zamknięciu wróć na przycisk, który je otworzył. Osoby korzystające z klawiatury nie zgubią wtedy miejsca na stronie.
  • Do delegowania zdarzeń fokusu używaj focusin i focusout. Zdarzenia focus i blur nie bąbelkują do rodziców.
  • Wygląd fokusu ustawiaj w CSS przez :focus-visible. Obramowanie pojawi się przy obsłudze klawiaturą, a nie po każdym kliknięciu myszą.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.