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

120 lines
4.1 KiB
JavaScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"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;
}
console.log("监听到回车键。。。。。。。。。。。。。。。。。。。");
this.appendChar("\r");
this.completeInput(); //立即完成输入
} else if (ev.key == "Delete" || ev.key == "Backspace") {
console.log("监听到删除键。。。。。。。。。。。。。。。。。。。");
this.dom.innerTex = "";
this.appendChar("delete");
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.toString()
for(let i = 0;i<this.keybufs.length;i++){
text = text+this.keybufs[i];
}
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
}