Улучшенный полноэкранный режим с API блокировки клавиатуры.

Используйте API блокировки клавиатуры для захвата клавиши Escape в полноэкранном режиме.

Если вы когда-либо играли в полноэкранную веб-игру, где появлялось диалоговое окно, которое вы инстинктивно отменяли клавишей Escape , то, вероятно, вас выкидывало из полноэкранного режима. Эта неприятная ситуация возникает из-за того, что диалоговое окно и полноэкранный режим «борются» за клавишу Escape . Это неравная борьба, поскольку по умолчанию полноэкранный режим всегда побеждает. Но как сделать так, чтобы диалоговое окно победило в борьбе за клавишу Escape ? Здесь в игру вступает API блокировки клавиатуры .

Нажмите клавишу Escape, чтобы выйти из полноэкранного режима.

Поддержка браузеров

Browser Support

  • Хром: 68.
  • Край: 79.
  • Firefox: не поддерживается.
  • Safari: не поддерживается.

Source

Используйте API блокировки клавиатуры

API блокировки клавиатуры доступно на navigator.keyboard. Метод lock() интерфейса Keyboard возвращает обещание после включения захвата нажатий любой или всех клавиш на физической клавиатуре. Этот метод может захватывать только те клавиши, к которым предоставлен доступ операционной системой. К счастью, клавиша Escape — одна из них.

Если ваше приложение поддерживает полноэкранный режим, используйте API блокировки клавиатуры в качестве прогрессивного расширения, захватывая клавишу Escape при запросе полноэкранного режима. Разблокируйте (то есть отключите захват) клавиатуру при выходе из полноэкранного режима с помощью метода unlock() интерфейса Keyboard .

// Feature detection.
const supportsKeyboardLock =
    ('keyboard' in navigator) && ('lock' in navigator.keyboard);

if (supportsKeyboardLock) {
  document.addEventListener('fullscreenchange', async () => {
    if (document.fullscreenElement) {
      // The magic happens here… 🦄
      await navigator.keyboard.lock(['Escape']);
      console.log('Keyboard locked.');
      return;
    }
    navigator.keyboard.unlock();
    console.log('Keyboard unlocked.');
  });
}

Это означает, что при использовании полноэкранного режима нажатие клавиши Escape по умолчанию закрывает диалоговое окно. Если пользователь нажмёт и удержит клавишу Escape , он всё равно сможет выйти из полноэкранного режима. Это лучшее из обоих миров.

Нажмите и удерживайте клавишу Escape, чтобы выйти из полноэкранного режима.

Демо

В демо-версии можно протестировать как стандартный, так и прогрессивно улучшенный вариант. Исходный код демо-версии менее понятен, чем предыдущий фрагмент, поскольку он должен демонстрировать оба варианта поведения.

Лучшая демонстрация полноэкранного режима.

На практике

Чтобы использовать это прогрессивное улучшение на практике, просто скопируйте предыдущий фрагмент. Он разработан для работы без необходимости внесения изменений, даже с существующим полноэкранным кодом. В качестве примера см. этот PR для игры Freeciv . После объединения PR вы можете отменить все игровые диалоги, нажав Escape .

Запрос на включение изменений на GitHub, добавляющий блокировку клавиатуры в игру Freeciv.

Бонусный букмарклет

Не все приложения или игры, поддерживающие полноэкранный режим, будут иметь открытый исходный код или принимать ваши исправления. Следующий букмарклет можно добавить на панель закладок и нажать на него, чтобы включить улучшенный полноэкранный режим.