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
4.0 KiB
JavaScript

3 years ago
"use strict";
/**
* 浏览器按键处理
* howay
* 20200421
* 1.0
*/
const KeyScaner = /** @class */ (function () {
3 years ago
function KeyScaner(_dom) {
this.keybufs = [];
this.altBuf = [];
this.isShift = false;
this.lastTime = 0;
/**
* 在收集到文本输入时触发
* @param text 收集到的连续文本
*/
this.onInput = function (text) {
};
3 years ago
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);
}
3 years ago
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") {
3 years ago
if (ev.altKey || ev.ctrlKey || ev.metaKey) {
return;
}
this.isShift = true;
} else if (ev.key == "Enter") {
3 years ago
if (ev.shiftKey || ev.altKey || ev.ctrlKey || ev.metaKey) {
return;
}
console.log("监听到回车键。。。。。。。。。。。。。。。。。。。");
3 years ago
this.appendChar("\r");
this.completeInput(); //立即完成输入
} else if (ev.key == "Delete" || ev.key == "Backspace") {
console.log("监听到删除键。。。。。。。。。。。。。。。。。。。");
this.dom.innerTex = "";
this.appendChar("delete");
this.completeInput(); //立即完成输入
} else {
3 years ago
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 {
3 years ago
this.appendChar(ev.key);
}
} else if ((charCode >= 65 && charCode <= 90) || (charCode >= 97 && charCode <= 122)) {
3 years ago
//忽略大小写锁定键直接通过SHIFT键判断大小写
if (ev.shiftKey) {
this.appendChar(ev.key.toUpperCase());
} else {
3 years ago
this.appendChar(ev.key.toLowerCase());
}
} else {
3 years ago
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") {
3 years ago
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();
3 years ago
}
};
/**
* 释放资源
*/
KeyScaner.prototype.dispose = function () {
this.dom.removeEventListener('keydown', this.onKeyDown);
this.dom.removeEventListener('keyup', this.onKeyUp);
clearInterval(this.interval);
};
return KeyScaner;
}());
export default {
KeyScaner
}