Files
kiss-translator/src/libs/shortcut.js

61 lines
1.3 KiB
JavaScript
Raw Normal View History

2023-09-07 23:47:24 +08:00
import { isSameSet } from "./utils";
/**
* 键盘快捷键监听
* @param {*} fn
* @param {*} target
2023-09-08 13:53:33 +08:00
* @param {*} timeout
2023-09-07 23:47:24 +08:00
* @returns
*/
2023-09-08 13:53:33 +08:00
export const shortcutListener = (fn, target = document, timeout = 3000) => {
2023-09-07 23:47:24 +08:00
const allkeys = new Set();
const curkeys = new Set();
2023-09-08 13:53:33 +08:00
let timer = null;
2023-09-07 23:47:24 +08:00
const handleKeydown = (e) => {
2023-09-08 13:53:33 +08:00
timer && clearTimeout(timer);
timer = setTimeout(() => {
allkeys.clear();
curkeys.clear();
clearTimeout(timer);
timer = null;
}, timeout);
2023-09-07 23:47:24 +08:00
if (e.code) {
allkeys.add(e.key);
curkeys.add(e.key);
2023-09-08 13:53:33 +08:00
fn([...curkeys], [...allkeys]);
2023-09-07 23:47:24 +08:00
}
};
const handleKeyup = (e) => {
curkeys.delete(e.key);
if (curkeys.size === 0) {
2023-09-08 13:53:33 +08:00
fn([...curkeys], [...allkeys]);
2023-09-07 23:47:24 +08:00
allkeys.clear();
}
};
target.addEventListener("keydown", handleKeydown);
target.addEventListener("keyup", handleKeyup);
return () => {
target.removeEventListener("keydown", handleKeydown);
target.removeEventListener("keyup", handleKeyup);
};
};
/**
* 注册键盘快捷键
* @param {*} targetKeys
* @param {*} fn
* @param {*} target
* @returns
*/
export const shortcutRegister = (targetKeys, fn, target = document) => {
2023-09-08 13:53:33 +08:00
return shortcutListener((curkeys) => {
if (isSameSet(new Set(targetKeys), new Set(curkeys))) {
2023-09-07 23:47:24 +08:00
fn();
}
}, target);
};