KeyboardEvent.getModifierState()

The KeyboardEvent.getModifierState() method returns the current state of the specified modifier key: true if the modifier is active (that is the modifier key is pressed or locked), otherwise, false.

Syntax

var active = event.getModifierState(keyArg);

Returns

A Boolean

Parameters

keyArg
A modifier key value. The value must be one of the KeyboardEvent.key values which represent modifier keys, or the string "Accel" . This is case-sensitive.

Modifier keys on Internet Explorer

IE9 uses "Scroll" for "ScrollLock" and "Win" for "OS".

Modifier keys on Gecko

When getModifierState() returns true on Gecko?
Windows Linux (GTK) Mac Android 2.3 Android 3.0 or latter
"Alt" Either Alt key or AltGr key pressed Alt key pressed ⌥ Option key pressed Alt key or option key pressed
"AltGraph"

Both Alt and Ctrl keys are pressed, or AltGr key is pressed

Level 3 Shift key (or Level 5 Shift key ) pressed ⌥ Option key pressed Not supported
"CapsLock" During LED for ⇪ Caps Lock turned on Not supported While CapsLock is locked
"Control" Either Ctrl key or AltGr key pressed Ctrl key pressed control key pressed menu key pressed. Ctrl key, control key or menu key pressed.
"Fn" Not supported Function key is pressed, but we're not sure what key makes the modifier state active. Fn key on Mac keyboard doesn't cause this active.
"FnLock" Not supported
"Hyper" Not supported
"Meta" Not supported Meta key pressed ⌘ Command key pressed Not supported ⊞ Windows Logo key or command key pressed
"NumLock" During LED for Num Lock turned on A key on numpad pressed Not supported While NumLock is locked
"OS" ⊞ Windows Logo key pressed Super key or Hyper key pressed (typically, mapped to ⊞ Windows Logo key) Not supported
"ScrollLock" During LED for Scroll Lock turned on During LED for Scroll Lock turned on, but typically this isn't supported by platform Not supported While ScrollLock is locked
"Shift" ⇧ Shift key pressed
"Super" Not supported
"Symbol" Not supported
"SymbolLock" Not supported
  • On the other platforms, "Alt", "Control" and "Shift" may be supported.
  • All modifiers (except "FnLock", "Hyper", "Super" and "Symbol" which are defined after Gecko implements this) are always supported for untrusted events on Gecko. This doesn't depend on the platform.

"Accel" virtual modifier

Note: The "Accel" virtual modifier has been effectively deprecated in current drafts of the DOM3 Events specification.

getModifierState() also accepts a deprecated virtual modifier named "Accel". event.getModifierState("Accel") returns true when at least one of KeyboardEvent.ctrlKey or KeyboardEvent.metaKey is true.

In old implementations and outdated specifications, it returned true when a modifier which is the typical modifier key for the shortcut key is pressed. For example, on Windows, pressing Ctrl key may make it return true. However, on Mac, pressing ⌘ Command key may make it return true. Note that which modifier key makes it return true depends on platforms, browsers, and user settings. For example, Firefox users can customize this with a pref, "ui.key.accelKey".

Example

// 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 somethig 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 Gecko
      event.preventDefault(); // consume the key event
      break;
    case "ArrowLeft":
    case "Left": // hack for IE and old Gecko
      // Do something different if ScrollLock is locked.
      event.preventDefault(); // consume the key event
      break;
    case "ArrowRight":
    case "Right": // hack for IE and old Gecko
      // Do something different if ScrollLock is locked.
      event.preventDefault(); // consume the key event
      break;
    case "ArrowUp":
    case "Up": // hack for IE and old Gecko
      // Do something different if ScrollLock is locked.
      event.preventDefault(); // consume the key event
      break;
  }
}

Although this example uses .getModifierState() with "Alt", "Control", "Meta" and "Shift", using event.altKey, event.ctrlKey, event.metaKey and event.shiftKey may be more preferable.

Specifications

Specification Status Comment
Document Object Model (DOM) Level 3 Events Specification
The definition of 'getModifierState()' in that specification.
Obsolete Initial definition (Modifier Keys spec)

Browser compatibility

DesktopMobile
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung Internet
getModifierStateChrome Full support 31Edge Full support 12Firefox Full support 15IE Full support 9Opera Full support 17Safari Full support 10.1WebView Android Full support 4.4.3Chrome Android Full support 31Firefox Android Full support 15Opera Android Full support 18Safari iOS Full support 10.3Samsung Internet Android Full support 2.0
"Accel" as a parameter
DeprecatedNon-standard
Chrome Full support 48Edge Full support ≤79Firefox Full support 32IE No support NoOpera Full support 35Safari No support NoWebView Android Full support 48Chrome Android Full support 48Firefox Android Full support 32Opera Android Full support 35Safari iOS No support NoSamsung Internet Android Full support 5.0
"Alt" as a parameter
DeprecatedNon-standard
Chrome Full support YesEdge Full support ≤79Firefox Full support YesIE ? Opera Full support YesSafari Full support 10.1WebView Android Full support YesChrome Android Full support YesFirefox Android Full support YesOpera Android Full support YesSafari iOS Full support 10.3Samsung Internet Android Full support Yes
"AltGraph" as a parameter
DeprecatedNon-standard
Chrome Full support 48Edge Full support ≤79Firefox Full support YesIE ? Opera Full support 35Safari Full support 10.1WebView Android Full support 48Chrome Android Full support 48Firefox Android Full support YesOpera Android Full support 35Safari iOS Full support 10.3Samsung Internet Android Full support 5.0
"CapsLock" as a parameterChrome Full support 48Edge Full support ≤79Firefox Full support YesIE ? Opera Full support 35Safari ? WebView Android Full support 48Chrome Android Full support 48Firefox Android Full support YesOpera Android Full support 35Safari iOS ? Samsung Internet Android Full support 5.0
"Control" as a parameterChrome Full support YesEdge Full support ≤79Firefox Full support YesIE ? Opera Full support YesSafari Full support 10.1WebView Android Full support YesChrome Android Full support YesFirefox Android Full support YesOpera Android Full support YesSafari iOS Full support 10.3Samsung Internet Android Full support Yes
"Fn" as a parameterChrome Full support 48Edge Full support ≤79Firefox Full support YesIE ? Opera Full support 35Safari ? WebView Android Full support 48Chrome Android Full support 48Firefox Android Full support YesOpera Android Full support 35Safari iOS ? Samsung Internet Android Full support 5.0
"FnLock" as a parameterChrome Full support YesEdge Full support ≤79Firefox No support NoIE ? Opera Full support YesSafari ? WebView Android Full support YesChrome Android Full support YesFirefox Android No support NoOpera Android Full support YesSafari iOS ? Samsung Internet Android Full support Yes
"Hyper" as a parameter
Deprecated
Chrome Full support YesEdge Full support ≤79Firefox No support NoIE ? Opera Full support YesSafari ? WebView Android Full support YesChrome Android Full support YesFirefox Android No support NoOpera Android Full support YesSafari iOS ? Samsung Internet Android Full support Yes
"Meta" as a parameterChrome Full support YesEdge Full support ≤79Firefox Full support YesIE ? Opera Full support YesSafari Full support 10.1WebView Android Full support YesChrome Android Full support YesFirefox Android Full support YesOpera Android Full support YesSafari iOS Full support 10.3Samsung Internet Android Full support Yes
"NumLock" as a parameterChrome Full support 48Edge Full support ≤79Firefox Full support YesIE ? Opera Full support 35Safari ? WebView Android Full support 48Chrome Android Full support 48Firefox Android Full support YesOpera Android Full support 35Safari iOS ? Samsung Internet Android Full support 5.0
"OS" as a parameterChrome Full support 48Edge Full support 12
Alternate Name
Full support 12
Alternate Name
Alternate Name Uses the non-standard name: Win
Firefox Full support YesIE Full support Yes
Alternate Name
Full support Yes
Alternate Name
Alternate Name Uses the non-standard name: Win
Opera Full support 35Safari ? WebView Android Full support 48Chrome Android Full support 48Firefox Android Full support YesOpera Android Full support 35Safari iOS ? Samsung Internet Android Full support 5.0
"ScrollLock" as a parameterChrome Full support 48Edge Full support 12
Alternate Name
Full support 12
Alternate Name
Alternate Name Uses the non-standard name: Scroll
Firefox Full support YesIE Full support Yes
Alternate Name
Full support Yes
Alternate Name
Alternate Name Uses the non-standard name: Scroll
Opera Full support 35Safari ? WebView Android Full support 48Chrome Android Full support 48Firefox Android Full support YesOpera Android Full support 35Safari iOS ? Samsung Internet Android Full support 5.0
"Shift" as a parameterChrome Full support YesEdge Full support ≤79Firefox Full support YesIE ? Opera Full support YesSafari Full support 10.1WebView Android Full support YesChrome Android Full support YesFirefox Android Full support YesOpera Android Full support YesSafari iOS Full support 10.3Samsung Internet Android Full support Yes
"Super" as a parameter
Deprecated
Chrome Full support YesEdge Full support ≤79Firefox No support NoIE ? Opera Full support YesSafari ? WebView Android Full support YesChrome Android Full support YesFirefox Android No support NoOpera Android Full support YesSafari iOS ? Samsung Internet Android Full support Yes
"Symbol" as a parameterChrome Full support 48Edge Full support ≤79Firefox No support NoIE ? Opera Full support 35Safari ? WebView Android Full support 48Chrome Android Full support 48Firefox Android No support NoOpera Android Full support 35Safari iOS ? Samsung Internet Android Full support 5.0
"SymbolLock" as a parameterChrome Full support YesEdge Full support ≤79Firefox No support NoIE ? Opera Full support YesSafari ? WebView Android Full support YesChrome Android Full support YesFirefox Android No support NoOpera Android Full support YesSafari iOS ? Samsung Internet Android Full support Yes

Legend

Full support
Full support
No support
No support
Compatibility unknown
Compatibility unknown
Non-standard. Expect poor cross-browser support.
Non-standard. Expect poor cross-browser support.
Deprecated. Not for use in new websites.
Deprecated. Not for use in new websites.
Uses a non-standard name.
Uses a non-standard name.

See also