使用 Keyboard Lock API 擷取金鑰

提供沉浸式全螢幕體驗,適用於各種用途,包括互動式網站、遊戲、遠端桌面或應用程式串流。

越來越多使用者大部分時間都在使用瀏覽器,因此互動豐富的網站、遊戲、遠端桌面串流和應用程式串流,都致力於提供沉浸式全螢幕體驗。為此,網站必須在全螢幕模式下存取特殊按鍵和鍵盤快速鍵,才能用於導覽、選單或遊戲。可能需要使用的按鍵包括 Esc、Alt + Tab、Cmd + ` 和 Ctrl + N。

根據預設,這些按鍵會由瀏覽器或基礎作業系統擷取,因此網頁應用程式無法使用。Keyboard Lock API 可讓網站使用主機 OS 允許的所有可用按鍵 (請參閱「瀏覽器相容性」)。

Ubuntu Linux 串流至 macOS Chrome 的瀏覽器分頁 (尚未在全螢幕模式下執行)。
問題:串流 Ubuntu Linux 遠端桌面「未」以全螢幕模式執行,且「未」啟用鍵盤鎖定功能,因此系統按鍵仍會由 macOS 主機作業系統擷取,且體驗「未」達到沉浸式效果。

使用 Keyboard Lock API

Keyboard API 的 Keyboard 介面提供多項函式,可切換擷取實體鍵盤按鍵動作,以及取得使用者鍵盤配置的相關資訊。

修課條件

新式瀏覽器提供兩種全螢幕模式:透過 Fullscreen API 啟動的 JavaScript,以及透過鍵盤快速鍵啟動的使用者。只有在由 JavaScript 啟動全螢幕時,才能使用 Keyboard Lock API。以下是 JavaScript 啟動全螢幕的範例:

await document.documentElement.requestFullscreen();

特徵偵測

您可以使用下列模式,檢查是否支援 Keyboard Lock API:

if ('keyboard' in navigator && 'lock' in navigator.keyboard) {
  // Supported!
}

鎖定鍵盤

Keyboard 介面的 lock() 方法會在啟用實體鍵盤上任何或所有按鍵的按鍵擷取功能後,傳回 Promise。這種方法只能擷取基礎作業系統授予存取權的金鑰。lock() 方法會採用一或多個要鎖定的按鍵代碼陣列。如未提供任何按鍵代碼,所有按鍵都會鎖定。如需有效按鍵代碼值的清單,請參閱 UI Events KeyboardEvent code Values 規格。

擷取所有按鍵

以下範例會擷取所有按鍵動作。

navigator.keyboard.lock();

擷取特定按鍵

以下範例會擷取 W、A、S 和 D 鍵。無論按下按鍵時使用哪些輔助鍵,系統都會擷取這些按鍵。假設使用美式 QWERTY 鍵盤配置,註冊 "KeyW" 可確保 W、Shift + W、Control + W、Control + Shift + W,以及所有其他與 W 搭配的輔助鍵組合都會傳送至應用程式。"KeyA"、"KeyS" 和 "KeyD" 也是如此。

await navigator.keyboard.lock([
  "KeyW",
  "KeyA",
  "KeyS",
  "KeyD",
]);

您可以使用鍵盤事件,回應擷取到的按鍵動作。舉例來說,以下程式碼使用 onkeydown 事件:

document.addEventListener('keydown', (event) => {
  if ((event.code === 'KeyA') && !(event.ctrlKey || event.metaKey)) {
    // Do something when the 'A' key was pressed, but only
    // when not in combination with the command or control key.
  }
});

解鎖鍵盤

unlock() 方法會解鎖 lock() 方法擷取的所有按鍵,並同步傳回。

navigator.keyboard.unlock();

關閉文件時,瀏覽器一律會隱含呼叫 unlock()。

示範

您可以執行這個試用版,測試 Keyboard Lock API。請務必查看原始碼。點選下方的「進入全螢幕模式」按鈕,即可在新視窗中啟動示範,進入全螢幕模式。

安全性考量

這個 API 的問題在於,它可能會用於擷取所有按鍵,並 (與 Fullscreen API 和 PointerLock API 搭配使用) 阻止使用者離開網頁。為避免這種情況,規格要求瀏覽器提供一種方法,讓使用者即使 API 要求所有按鍵,也能退出鍵盤鎖定。在 Chrome 中,這個緊急出口是長按 Esc 鍵 (兩秒),即可觸發退出鍵盤鎖定。

特別銘謝

本文由 Joe Medley 和 Kayce Basques 審查。鍵盤鎖定規格由 Gary Kacmarcik 和 Jamie Walch 撰寫。