A modest js library that dispatches low-level keyboard events in the form of CustomEvents.
Hotkey listener is 5.99kb according to Unpkg. https://unpkg.com/browse/hotkey-listener/
Hotkey Listener is 2.6kb GZipped according to Bundlephobia. https://bundlephobia.com/result?p=hotkey-listener@0.0.3
Hotkey Listener can only be registered on HTMLElement
's that implement
the "KeyboardEvent" interface.
For example: window
, document
npm install hotkey-listener
## OR
yarn add hotkey-listener
// index.js
import hotkeyListener from "hotkey-listener"
hotkeyListener.register({
element: window,
keys: [
"f5",
"ctrl+d"
],
eventOptions: {
// Required to preventDefault() in chrome
cancelable: true
}
})
window.addEventListener("keydown:f5", (event) => {
// Prevent window refresh
event.preventDefault()
console.log("f5 pushed")
console.log(event.cancelable)
})
window.addEventListener("keydown:ctrl+d", (event) => {
event.preventDefault()
console.log(`${event.detail.key} pushed`) // ctrl+d pressed
})
Hotkey listener creates custom keyup:<keystroke>
and keydown:<keystroke>
events.
Events also record the key that was pressed via event.detail.key
hotkeyListener.register({
element: <HTMLElement>, // Default is window
keys: <String[]>,
// https://github.com/jaywcjlove/hotkeys#option
// element, keyup, and keydown are already predefined
hotkeyOptions: {
scope: <String>,
splitKey <String>
},
// https://developer.mozilla.org/en-US/docs/Web/API/Event/Event
// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent
eventOptions: {
bubbles: <Boolean>, // default false
cancelable: <Boolean>, // default false
composed: <Boolean>, // default false
detail: { key: "<key pressed>" }
// Detail is an Object you can attach other [key: value] pairs to
},
})
Should you need more finely grained tuning of hotkeys
, you can
communicate with the hotkeys
API directly. For example, to enable
hotkeys on input
, textarea
, etc, you can do the following:
import hotkeyListener from "hotkey-listener"
hotkeyListener.hotkeys.filter = function(event) {
return true
}
// application.js
import hotkeyListener from "hotkey-listener"
hotkeyListener.register({
element: window,
keys: [
"f5",
"ctrl+d"
],
eventOptions: {
// Required to preventDefault() in chrome
cancelable: true
}
})
Then in your HTML for a stimulus controller you can do this:
<div data-action="keydown:f5@window->my-controller#doStuff">
</div>
https://github.com/jaywcjlove/hotkeys#filter
Hotkey-Listener under the hood uses the hotkeys
library to dispatch CustomEvents to the client.