Метод pause() используется для временной приостановки
работы ловушки фокуса (focus trap) без её полной деактивации. При вызове
этого метода библиотека прекращает контроль над перемещением фокуса,
однако состояние ловушки и её конфигурация сохраняются. Это позволяет
позже возобновить её работу с помощью метода unpause() без
необходимости повторной инициализации.
Такой механизм полезен в интерфейсах с несколькими вложенными интерактивными компонентами, где управление фокусом должно временно переходить от одной области интерфейса к другой.
Основная задача pause() — временно отключить
ограничение перемещения фокуса, сохранив при этом активную
структуру ловушки.
В обычной ситуации активная focus trap:
Tab внутри
контейнера;После вызова pause():
Это отличие принципиально важно: ловушка не уничтожается, а лишь временно перестаёт вмешиваться в управление фокусом.
trap.pause();
Где trap — объект ловушки, созданный функцией
createFocusTrap.
pause()Приостановка ловушки вызывает ряд внутренних изменений:
Tab внутри
контейнера.При этом сохраняются:
Благодаря этому последующий вызов unpause()
восстанавливает работу практически мгновенно.
pause() от
deactivate()Методы pause() и deactivate() решают разные
задачи.
pause()unpause().deactivate()returnFocus);Сравнение:
| Метод | Состояние ловушки | Возможность возобновления |
|---|---|---|
| pause() | сохранено | через unpause() |
| deactivate() | завершено | требуется activate() |
Одним из распространённых случаев применения pause()
является вложенный модальный интерфейс.
Пример:
import { createFocusTrap } from 'focus-trap';
const modalTrap = createFocusTrap('#modal');
const popupTrap = createFocusTrap('#popup');
modalTrap.activate();
function openPopup() {
modalTrap.pause();
popupTrap.activate();
}
function closePopup() {
popupTrap.deactivate();
modalTrap.unpause();
}
В такой архитектуре:
Focus Trap поддерживает сценарии с несколькими ловушками. Метод
pause() играет ключевую роль при управлении их
взаимодействием.
Без приостановки может возникнуть конфликт:
Tab становится непредсказуемой;Корректная стратегия:
Схема взаимодействия:
Основная ловушка
↓ pause()
Вложенная ловушка
↓ deactivate()
Основная ловушка
↓ unpause()
Во время паузы библиотека временно отключает обработчики:
keydownfocusinmousedowntouchstartclickЭто позволяет странице работать так, как будто ловушка отсутствует.
Однако сама структура объекта остаётся в памяти и продолжает хранить ссылки на контейнеры и параметры.
Активная ловушка:
Tab и Shift+Tab;Во время паузы:
Tab работает по стандартным правилам
браузера;После unpause() поведение полностью
восстанавливается.
pause()Метод безопасен при повторных вызовах.
Если ловушка уже находится в состоянии паузы:
trap.pause();
trap.pause();
дополнительные вызовы не вызывают ошибок и не меняют состояние.
Это реализовано через внутренний флаг паузы.
Внутреннее состояние ловушки содержит признак paused.
Хотя он не всегда используется напрямую разработчиками, он участвует во
внутренней логике библиотеки:
unpause().unpause()Метод pause() всегда предполагает возможность
последующего восстановления.
Возобновление выполняется следующим образом:
trap.unpause();
После этого:
Важно, что фокус не принудительно перемещается — управление просто возвращается библиотеке.
Интерфейс с несколькими уровнями взаимодействия:
const modalTrap = createFocusTrap('#modal');
const confirmTrap = createFocusTrap('#confirm');
const helpTrap = createFocusTrap('#help');
modalTrap.activate();
function openConfirm() {
modalTrap.pause();
confirmTrap.activate();
}
function openHelp() {
confirmTrap.pause();
helpTrap.activate();
}
function closeHelp() {
helpTrap.deactivate();
confirmTrap.unpause();
}
function closeConfirm() {
confirmTrap.deactivate();
modalTrap.unpause();
}
Такая архитектура обеспечивает:
pause()1. Повторное использование ловушек
Не требуется уничтожать и создавать новые экземпляры.
2. Производительность
Минимизируется количество операций инициализации.
3. Управление сложными интерфейсами
Упрощается работа с многоуровневыми диалогами.
4. Сохранение состояния
Фокусируемые элементы и настройки не пересчитываются.
Внутри библиотеки метод pause():
paused;Эта архитектура позволяет быстро переключаться между несколькими ловушками без перерасчёта DOM-структуры.
pause() оправданоМетод применяется в случаях:
В подобных системах pause() обеспечивает гибкое
управление фокусом и предотвращает конфликты между различными областями
интерфейса.