Метод unpause() используется для возобновления работы
ранее приостановленной ловушки фокуса. Он применяется в ситуациях, когда
ловушка фокуса временно отключалась с помощью метода
pause(), но не уничтожалась полностью. После вызова
unpause() механизм ограничения фокуса снова начинает
контролировать перемещение фокуса внутри заданного контейнера.
Focus Trap применяется для ограничения навигации по элементам
интерфейса в пределах конкретного контейнера — например, модального
окна, панели настроек или диалогового интерфейса. При активной ловушке
фокуса пользователь не может переместить фокус за пределы указанной
области при помощи клавиатуры. Метод unpause() возвращает
это поведение после временной паузы.
В интерфейсах часто возникают ситуации, когда активная ловушка фокуса должна временно уступить управление другому компоненту. Например:
Вместо полной деактивации ловушки используется метод
pause(), который временно отключает обработку фокуса. При
этом состояние ловушки сохраняется: контейнер, настройки и внутренние
обработчики не уничтожаются.
Метод unpause() возвращает ловушку в активное
состояние.
unpause()Внутренний механизм Focus Trap отслеживает состояние каждой ловушки. Существует несколько возможных состояний:
При вызове unpause() происходит следующее:
Если ловушка не была приостановлена, вызов unpause() не
приводит к изменению состояния.
focusTrap.unpause();
Метод не принимает аргументов и не возвращает значения.
Создание ловушки фокуса:
import { createFocusTrap } from 'focus-trap';
const modal = document.querySelector('#modal');
const trap = createFocusTrap(modal);
trap.activate();
Временная приостановка:
trap.pause();
Возобновление работы ловушки:
trap.unpause();
После вызова unpause() фокус снова будет ограничен
элементами внутри контейнера modal.
После восстановления ловушки фокуса библиотека выполняет несколько внутренних операций:
1. Проверка текущего фокуса
Если фокус находится вне контейнера ловушки, библиотека может переместить его к допустимому элементу внутри.
2. Восстановление циклической навигации
Клавиша Tab снова начинает перемещать фокус только между
элементами внутри контейнера.
3. Перехват событий
Восстанавливаются обработчики:
keydownfocusinclickЭти события используются для контроля перемещения фокуса.
Типичная ситуация применения unpause() возникает при
наличии нескольких модальных интерфейсов.
const mainTrap = createFocusTrap(mainModal);
mainTrap.activate();
Перед открытием второго окна первая ловушка ставится на паузу:
mainTrap.pause();
const nestedTrap = createFocusTrap(nestedModal);
nestedTrap.activate();
После закрытия вложенного интерфейса:
nestedTrap.deactivate();
mainTrap.unpause();
Теперь фокус снова ограничивается элементами основного модального окна.
unpause() и activate()Несмотря на схожий результат, эти методы выполняют разные задачи.
| Метод | Назначение |
|---|---|
activate() |
включает ловушку фокуса с нуля |
pause() |
временно отключает активную ловушку |
unpause() |
возвращает ловушку из состояния паузы |
activate() создаёт активное состояние независимо от
предыдущего.
unpause() работает только с уже существующей ловушкой,
ранее приостановленной.
Focus Trap поддерживает стек активных ловушек. Когда появляется новая ловушка, предыдущая может быть приостановлена.
Внутренний механизм обеспечивает корректное переключение между ними.
Пример последовательности:
В таких сценариях unpause() используется для возврата
управления предыдущему интерфейсу.
Если метод pause() вызывается несколько раз подряд,
состояние ловушки остаётся «приостановленным».
Метод unpause() возвращает ловушку в активное состояние
независимо от количества предыдущих вызовов pause().
Однако рекомендуется избегать сложных цепочек пауз, чтобы не усложнять управление интерфейсом.
Модальное окно содержит кнопку, открывающую контекстное меню.
modalTrap.pause();
menuTrap.activate();
После закрытия меню:
menuTrap.deactivate();
modalTrap.unpause();
Некоторые интерфейсы временно передают управление фокусом компоненту автодополнения.
dialogTrap.pause();
autocompleteTrap.activate();
После завершения взаимодействия:
autocompleteTrap.deactivate();
dialogTrap.unpause();
В административных панелях или IDE-интерфейсах могут одновременно использоваться:
Каждый из таких элементов может иметь собственную ловушку фокуса. Временная пауза и последующее возобновление позволяют безопасно переключать управление между ними.
Внутри Focus Trap метод unpause() выполняет несколько
действий:
paused.Обработчики обычно привязываются к объекту document:
TabМетод unpause() учитывает особенности поведения фокуса в
разных браузерах.
Некоторые браузеры могут:
body;После возобновления ловушки библиотека выполняет проверку допустимого элемента фокуса и при необходимости корректирует его.
unpause() после deactivate()После полной деактивации ловушки её состояние сбрасывается.
trap.deactivate();
trap.unpause(); // эффекта не будет
В таких случаях требуется повторная активация:
trap.activate();
Если новая ловушка активируется без паузы предыдущей, может возникнуть конфликт управления фокусом.
Корректный порядок:
pause → activate → deactivate → unpause
Если объект ловушки не сохраняется, вызвать unpause()
невозможно.
Неправильный подход:
createFocusTrap(modal).activate();
Корректный вариант:
const trap = createFocusTrap(modal);
trap.activate();
Метод unpause() используется совместно с другими
функциями библиотеки.
activate() Запускает ловушку
фокуса.
deactivate() Полностью отключает
ловушку.
pause() Временно отключает обработку
фокуса.
updateContainerElements() Обновляет
список контейнеров, участвующих в ловушке.
Использование unpause() обеспечивает гибкое управление
навигацией по интерфейсу. Метод позволяет временно передавать контроль
фокуса другим компонентам без разрушения текущего состояния ловушки.
Такой подход особенно важен для сложных веб-интерфейсов, где одновременно работают несколько слоёв взаимодействия и требуется строгий контроль клавиатурной навигации.