提供沉浸式全螢幕體驗,適用於各種用途,包括互動式網站、遊戲,以及遠端桌面或應用程式串流。
越來越多使用者的大部分時間都花在瀏覽器上,因此互動豐富的網站、遊戲、遠端桌面串流和應用程式串流,都致力於提供沉浸式全螢幕體驗。為此,網站必須在全螢幕模式下存取特殊鍵和鍵盤快速鍵,才能用於導覽、選單或遊戲。可能需要按下的按鍵包括 Esc、Alt + Tab、Cmd + ` 和 Ctrl + N。
根據預設,這些按鍵會由瀏覽器或基礎作業系統擷取,因此網頁應用程式無法使用。網站可透過鍵盤鎖定 API 使用主機 OS 允許的所有可用按鍵 (請參閱瀏覽器相容性)。
使用 Keyboard Lock API
Keyboard API 的 Keyboard 介面提供多項函式,可切換擷取實體鍵盤的按鍵動作,以及取得使用者鍵盤配置的相關資訊。
修課條件
新式瀏覽器提供兩種全螢幕模式:透過 Fullscreen API 以 JavaScript 啟動,以及透過鍵盤快速鍵由使用者啟動。只有在 JavaScript 啟動的全螢幕模式處於啟用狀態時,才能使用鍵盤鎖定 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()。
示範
您可以執行這個示範,測試鍵盤鎖定 API。請務必查看原始碼。按一下下方的「進入全螢幕模式」按鈕,即可在新視窗中啟動示範,並進入全螢幕模式。
安全性考量
這個 API 的一個疑慮是,它可能會用來擷取所有按鍵,並 (搭配 Fullscreen API 和 PointerLock API) 阻止使用者離開網頁。為避免這種情況,規格要求瀏覽器提供方法,讓使用者即使在 API 要求所有按鍵的情況下,也能退出鍵盤鎖定模式。在 Chrome 中,只要長按 Esc 鍵兩秒,即可觸發這個逃生出口,退出鍵盤鎖定模式。
實用連結
特別銘謝
本文由 Joe Medley 和 Kayce Basques 審查。鍵盤鎖定規格是由 Gary Kacmarcik 和 Jamie Walch 撰寫。