You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
spms-vue/src/plugin/KeyScaner.js

117 lines
3.7 KiB
JavaScript

3 years ago
"use strict";
/**
* 浏览器按键处理
* howay
* 20200421
* 1.0
*/
const KeyScaner = /** @class */ (function () {
function KeyScaner(_dom) {
this.keybufs = [];
this.altBuf = [];
this.isShift = false;
this.lastTime = 0;
/**
* 在收集到文本输入时触发
* @param text 收集到的连续文本
*/
this.onInput = function (text) { };
this.dom = _dom;
_dom.addEventListener('keydown', this.onKeyDown.bind(this));
_dom.addEventListener('keyup', this.onKeyUp.bind(this));
this.interval = setInterval(this.onTick.bind(this), 100);
}
KeyScaner.prototype.appendChar = function (c) {
this.keybufs.push(c);
};
KeyScaner.prototype.onKeyDown = function (ev) {
this.lastTime = new Date().getTime();
if (ev.key == "Alt") {
if (ev.shiftKey || ev.ctrlKey || ev.metaKey) {
return;
}
}
else if (ev.key == "Shift") {
if (ev.altKey || ev.ctrlKey || ev.metaKey) {
return;
}
this.isShift = true;
}
else if (ev.key == "Enter") {
if (ev.shiftKey || ev.altKey || ev.ctrlKey || ev.metaKey) {
return;
}
this.appendChar("\r");
this.completeInput(); //立即完成输入
}
else {
if (ev.key.length == 1) {
var charCode = ev.key.charCodeAt(0);
if (charCode >= 48 && charCode <= 57) {
if (ev.altKey) {
this.altBuf.push(ev.key);
}
else {
this.appendChar(ev.key);
}
}
else if ((charCode >= 65 && charCode <= 90) || (charCode >= 97 && charCode <= 122)) {
//忽略大小写锁定键直接通过SHIFT键判断大小写
if (ev.shiftKey) {
this.appendChar(ev.key.toUpperCase());
}
else {
this.appendChar(ev.key.toLowerCase());
}
}
else {
this.appendChar(ev.key);
}
}
//忽略其他控制键
}
};
KeyScaner.prototype.onKeyUp = function (ev) {
this.lastTime = new Date().getTime();
if (ev.key == "Alt") {
if (this.altBuf && this.altBuf.length > 0) {
var str = this.altBuf.join("");
var num = parseInt(str);
var c = String.fromCharCode(num);
this.appendChar(c);
this.altBuf = [];
}
}
else if (ev.key == "Shift") {
this.isShift = false;
}
};
KeyScaner.prototype.completeInput = function () {
var text = this.keybufs.join("");
this.keybufs = [];
if (this.onInput) {
this.onInput.bind(this)(text);
}
};
KeyScaner.prototype.onTick = function () {
if (this.keybufs && this.keybufs.length > 0 && (!this.altBuf || this.altBuf.length == 0) && new Date().getTime() - this.lastTime > 500) {
//有缓存的字符且没有缓存的alt字符 且 与上次按键时间超过500毫秒。 收集输入
this.completeInput();
}
};
/**
* 释放资源
*/
KeyScaner.prototype.dispose = function () {
this.dom.removeEventListener('keydown', this.onKeyDown);
this.dom.removeEventListener('keyup', this.onKeyUp);
clearInterval(this.interval);
};
return KeyScaner;
}());
export default {
KeyScaner
}