KeyboardEvent: getModifierState() 方法

Baseline 廣泛可用 *

此特性已得到良好確立,可跨多種裝置和瀏覽器版本使用。自 2017 年 3 月起,所有瀏覽器均支援此特性。

* 此特性的某些部分可能存在不同級別的支援。

KeyboardEvent.getModifierState() 方法返回指定修飾鍵的當前狀態:如果修飾鍵處於活動狀態(即修飾鍵被按下或鎖定),則返回 true,否則返回 false

語法

js
getModifierState(key)

引數

key

一個修飾鍵值。該值必須是表示修飾鍵的 KeyboardEvent.key 值之一,或者字串 "Accel" 已棄用 。此值區分大小寫。

返回值

布林值。

Firefox 中的修飾鍵

在 Firefox 中,getModifierState() 何時返回 true?

Windows Linux (GTK) Mac Android 2.3 Android 3.0 或更高版本
"Alt" 按下 Alt 鍵或 AltGr 按下 Alt 按下 ⌥ Option 按下 Alt 鍵或 option
"AltGraph"

同時按下 AltCtrl 鍵,或按下 AltGr

按下 Level 3 Shift 鍵(或 Level 5 Shift 鍵) 按下 ⌥ Option 不支援 不支援
"CapsLock" ⇪ Caps Lock 指示燈亮起時 不支援 CapsLock 被鎖定期間
"Control" 按下 Ctrl 鍵或 AltGr 按下 Ctrl 按下 control 按下 menu 鍵。 按下 Ctrl 鍵、control 鍵或 menu 鍵。
"Fn" 不支援 不支援 不支援 不支援 按下 Function 鍵,但不確定哪個鍵激活了修飾鍵狀態。Mac 鍵盤上的 Fn 鍵不會導致此狀態啟用。
"FnLock" 不支援 不支援 不支援 不支援 不支援
"Hyper" 不支援 不支援 不支援 不支援 不支援
"Meta" (Firefox 118 及更高版本) 按下 ⊞ Windows Logo 按下 Meta 按下 ⌘ Command 不支援 按下 ⊞ Windows Logo 鍵或 command
"NumLock" Num Lock 指示燈亮起時 按下數字鍵盤上的某個鍵 不支援 NumLock 被鎖定期間
"OS" (Firefox 118 之前) 按下 ⊞ Windows Logo 按下 Super 鍵或 Hyper 鍵(通常對映到 ⊞ Windows Logo 鍵) 不支援 不支援 不支援
"ScrollLock" Scroll Lock 指示燈亮起時 Scroll Lock 指示燈亮起時,但平臺通常不支援此功能 不支援 不支援 ScrollLock 被鎖定期間
"Shift" 按下 ⇧ Shift
"Super" 不支援 不支援 不支援 不支援 不支援
"Symbol" 不支援 不支援 不支援 不支援 不支援
"SymbolLock" 不支援 不支援 不支援 不支援 不支援
  • 在其他平臺上,"Alt"、"Control" 和 "Shift" 可能會得到支援。
  • 對於不可信事件,Firefox 始終支援所有修飾鍵("FnLock"、"Hyper"、"Super" 和 "Symbol" 除外,這些是在 Firefox 實現之後定義的)。這不取決於平臺。

"Accel" 虛擬修飾鍵

注意: "Accel" 虛擬修飾鍵在 DOM3 Events 規範的當前草案中已被實際棄用

getModifierState() 還接受一個已棄用的虛擬修飾鍵 "Accel"event.getModifierState("Accel")KeyboardEvent.ctrlKeyKeyboardEvent.metaKey 至少有一個為 true 時返回 true

在舊的實現和過時的規範中,當按下用於快捷鍵的典型修飾鍵時,它會返回 true。例如,在 Windows 上,按下 Ctrl 鍵可能會使其返回 true。但是,在 Mac 上,按下 ⌘ Command 鍵可能會使其返回 true。請注意,哪個修飾鍵使其返回 true 取決於平臺、瀏覽器和使用者設定。例如,Firefox 使用者可以透過首選項 "ui.key.accelKey" 來自定義此行為。

示例

js
function handleKeyboardEvent(event) {
  // Ignore if following modifier is active.
  if (
    event.getModifierState("Fn") ||
    event.getModifierState("Hyper") ||
    event.getModifierState("OS") ||
    event.getModifierState("Super") ||
    event.getModifierState("Win") /* hack for IE */
  ) {
    return;
  }

  // Also ignore if two or more modifiers except Shift are active.
  if (
    event.getModifierState("Control") +
      event.getModifierState("Alt") +
      event.getModifierState("Meta") >
    1
  ) {
    return;
  }

  // Handle shortcut key with standard modifier
  if (event.getModifierState("Accel")) {
    switch (event.key.toLowerCase()) {
      case "c":
        if (event.getModifierState("Shift")) {
          // Handle Accel + Shift + C
          event.preventDefault(); // consume the key event
        }
        break;
      case "k":
        if (!event.getModifierState("Shift")) {
          // Handle Accel + K
          event.preventDefault(); // consume the key event
        }
        break;
    }
    return;
  }

  // Do something different for arrow keys if ScrollLock is locked.
  if (
    (event.getModifierState("ScrollLock") ||
      event.getModifierState("Scroll")) /* hack for IE */ &&
    !event.getModifierState("Control") &&
    !event.getModifierState("Alt") &&
    !event.getModifierState("Meta")
  ) {
    switch (event.key) {
      case "ArrowDown":
      case "Down": // hack for IE and old Firefox
        event.preventDefault(); // consume the key event
        break;
      case "ArrowLeft":
      case "Left": // hack for IE and old Firefox
        // Do something different if ScrollLock is locked.
        event.preventDefault(); // consume the key event
        break;
      case "ArrowRight":
      case "Right": // hack for IE and old Firefox
        // Do something different if ScrollLock is locked.
        event.preventDefault(); // consume the key event
        break;
      case "ArrowUp":
      case "Up": // hack for IE and old Firefox
        // Do something different if ScrollLock is locked.
        event.preventDefault(); // consume the key event
        break;
    }
  }
}

注意: 儘管此示例在 .getModifierState() 中使用了 "Alt""Control""Meta""Shift",但使用 event.altKeyevent.ctrlKeyevent.metaKeyevent.shiftKey 可能更可取。

規範

規範
UI 事件
# dom-keyboardevent-getmodifierstate

瀏覽器相容性

另見