JS властивість Event.relatedTarget (Focus)


Загальний опис

relatedTarget — це властивість об'єкта FocusEvent, яка містить посилання на елемент, з якого або на який переміщений фокус під час подій, пов'язаних із фокусуванням, таких як focusin, focusout, blur або focus. Для подій focusin і focus ця властивість вказує на елемент, з якого фокус перемістився, а для focusout і blur — на елемент, на який фокус перейшов.

Ця властивість особливо корисна при роботі з формами або складними інтерфейсами, коли важливо знати, звідки був втрачений або куди переміщений фокус. Наприклад, при створенні кастомних валідацій форм або динамічного перемикання елементів, знання попереднього елемента фокусування може допомогти в реалізації специфічної логіки поведінки.

Варто зазначити, що relatedTarget може бути null у випадках, коли фокус переміщений на інший елемент або за межі документа, наприклад, коли користувач натискає іншу вкладку браузера. Це важливо враховувати, щоб уникнути помилок при обробці фокусу.

Приклад використання:

inputElement.addEventListener('focusout', function(event) {
  if (event.relatedTarget) {
    console.log("Фокус перемістився на елемент: ", event.relatedTarget);
  } else {
    console.log("Фокус втрачений.");
  }
});

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

автор: Bond

Порада

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

автор: Bond
Порада

Щоб уникнути повторної обробки подій, можна порівняти попередній елемент фокусування з поточним за допомогою relatedTarget. Це може бути корисно, наприклад, у випадках, коли потрібно уникнути зайвих перезавантажень компонентів або повторного запуску анімацій.

автор: Bond
Порада

Для випадаючих меню або діалогових вікон можна використовувати relatedTarget, щоб перевірити, чи фокус перемістився на елемент всередині контейнера або зовні його. Це дозволяє точніше контролювати закриття меню або діалогів.

автор: Bond

Синтаксис

event.relatedTarget

Переглядачі

Підтримка: стаціонарні переглядачі
Переглядач Google Chrome Mozilla Firefox Apple Safari Opera Microsoft EDGE
26 24 7 15 12
Підтримка: мобільні переглядачі
Переглядач Mobile Google Android Mobile Google Chrome Mobile Mozilla Firefox Mobile Apple Safari
4.4 26 24 7
Підтримка: серверні переглядачі
Переглядач Node.js Deno
- -

Приклади

+ запропонувати свій приклад у пісочниці

Цей приклад показує, як закрити діалогове вікно, якщо фокус перемістився за межі його вмісту. Використання relatedTarget дозволяє точно визначити, чи фокус вийшов за межі діалогового елемента, що допомагає контролювати його видимість.

HTML

<div id="dialog">Демонстраційний елемент</div>
<button id="closeButton">Закрити</button>

JS

const dialog = document.getElementById('dialog');
const closeButton = document.getElementById('closeButton');

dialog.addEventListener('focusout', function(event) {
  if (!dialog.contains(event.relatedTarget)) {
    dialog.style.display = 'none';
    console.log("Діалогове вікно закрите через втрату фокусу.");
  }
});
автор: Bond

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

HTML

<div id="input1">Демонстраційний елемент</div>
<div id="input2">Демонстраційний елемент</div>

JS

const input1 = document.getElementById('input1');
const input2 = document.getElementById('input2');

input1.addEventListener('focusout', function(event) {
  if (event.relatedTarget === input2) {
    console.log("Фокус перемістився з першого поля на друге.");
  } else {
    console.log("Фокус залишив перше поле.");
  }
});
автор: Bond

У цьому прикладі користувач може переміщувати фокус між двома полями та кнопкою. При кожній зміні фокусу виводиться інформація про те, з якого елемента фокус перейшов на інший, використовуючи властивість FocusEvent -> relatedTarget. Це допомагає показати, як можна відслідковувати переміщення фокусу та застосовувати цю інформацію у взаємодії з формами або іншими елементами сторінки.

автор: Bond

Коментарі

Коментарів ще немає — будьте першим!

Відповідь для

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Увійдіть — коментар з'явиться одразу, без капчі й очікування перевірки.

Пропозиція правки

Ваша версія — : після перевірки замінить чинну. Нова порада чи нотатка — з'явиться на сторінці після перевірки.

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія секції «»: після перевірки замінить чинну.

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Ваша версія опису «»: після перевірки замінить чинну.

Як форматувати текст?
Пишемо Виходить
**важливо**
*акцент*
~~застаріле~~
Виділення в тексті. Те саме роблять кнопки панелі, що спливає над виділеним.
## Як працює каскад
### Порядок оголошень
Заголовки всередині тексту. Найбільший не потрібен — він у сторінки вже є.
[[css/property/color]] Посилання на сторінку довідника. Наберіть [[ — поле саме підкаже шляхи, а хибний підкреслить хвилею.
[MDN](https://developer.mozilla.org) Посилання на чужий сайт.
![Схема каскаду](https://site.com/схема.png) Картинка. Опис обов'язковий: його читають пошуковик і незрячі.
Задайте `display: grid` контейнеру Код усередині речення.
```css
.card { display: grid }
```
Код блоком. Мова після трьох лапок вмикає підсвітку.
- Походження
1. Походження
Перелік: маркований і нумерований.
- [ ] дописати приклади
- [x] перевірити в Firefox
Перелік завдань із галочками. Пробіл у порожніх дужках обов'язковий.
> Порядок важить лише за рівної ваги. Цитата на всю ширину абзацу.
Специфічність
: вага селектора; більша перемагає
Список означень: термін, а під ним пояснення з відступом. Пробіл після двокрапки обов'язковий.
Каскад має три критерії[^1]
[^1]: Походження, специфічність, порядок.
Виноска: номер у тексті, примітка внизу сторінки. Без згадки [^1] у тексті примітка не з'явиться.
Відповідь: ||сорок два|| Ховає те, що між рисками: читач бачить на цьому місці розмиту пляму, а решта речення лишається звичайною. Клац — і текст відкрито.
|| Показати рішення
Задайте контейнеру `display: grid`.
||
Ховає цілі абзаци. На сторінці видно лише підпис із першого рядка («Показати рішення»), решта розгортається клацанням по ньому. Закривні риски — окремим рядком.
Порожній рядок Новий абзац. Щоб перенести рядок усередині абзацу, поставте \ в його кінці.

Ви гість — діють добові ліміти. Увійдіть, щоб пропонувати без капчі.

Зворотний зв'язок
Вхід