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

浏览器兼容性

另见