File size: 953 Bytes
4d70170 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import { onMounted, onUnmounted } from 'vue'
type KeyboardHandler = (event: KeyboardEvent) => boolean | void | Promise<boolean | void>
function handleKeyboard(type: 'keyup' | 'keydown', cb: KeyboardHandler, force: boolean) {
function handler(event: KeyboardEvent) {
if (!force && (
typeof HTMLElement !== 'undefined' && event.target instanceof HTMLElement && (
event.target.tagName === 'INPUT'
|| event.target.tagName === 'TEXTAREA'
)
)) {
return
}
const result = cb(event)
if (result === false) {
event.preventDefault()
}
}
onMounted(() => {
document.addEventListener(type, handler)
})
onUnmounted(() => {
document.removeEventListener(type, handler)
})
}
export function onKeyUp(cb: KeyboardHandler, force = false) {
handleKeyboard('keyup', cb, force)
}
export function onKeyDown(cb: KeyboardHandler, force = false) {
handleKeyboard('keydown', cb, force)
}
|