"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.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 }