|  |  |  | @ -6,110 +6,141 @@ | 
			
		
	
		
			
				
					|  |  |  |  |  * 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); | 
			
		
	
		
			
				
					|  |  |  |  |   function KeyScaner(_dom) { | 
			
		
	
		
			
				
					|  |  |  |  |     this.keybufs = []; | 
			
		
	
		
			
				
					|  |  |  |  |     this.altBuf = []; | 
			
		
	
		
			
				
					|  |  |  |  |     this.isShift = false; | 
			
		
	
		
			
				
					|  |  |  |  |     this.lastTime = 0; | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 在收集到文本输入时触发 | 
			
		
	
		
			
				
					|  |  |  |  |      * @param text 收集到的连续文本 | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     this.onInput = function (text) { | 
			
		
	
		
			
				
					|  |  |  |  |     }; | 
			
		
	
		
			
				
					|  |  |  |  |     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 == "Delete" || ev.key == "Backspace") { | 
			
		
	
		
			
				
					|  |  |  |  |             this.dom.innerTex = ""; | 
			
		
	
		
			
				
					|  |  |  |  |             this.appendChar("delete"); | 
			
		
	
		
			
				
					|  |  |  |  |             this.completeInput(); //立即完成输入
 | 
			
		
	
		
			
				
					|  |  |  |  |     this.dom = _dom; | 
			
		
	
		
			
				
					|  |  |  |  |     _dom.addEventListener('keydown', this.onKeyDown.bind(this)); | 
			
		
	
		
			
				
					|  |  |  |  |     _dom.addEventListener('keyup', this.onKeyUp.bind(this)); | 
			
		
	
		
			
				
					|  |  |  |  |     _dom.addEventListener('keypress', this.onKeyPress.bind(this)); | 
			
		
	
		
			
				
					|  |  |  |  |     this.interval = setInterval(this.onTick.bind(this), 100); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   KeyScaner.prototype.appendChar = function (c) { | 
			
		
	
		
			
				
					|  |  |  |  |     this.keybufs.push(c); | 
			
		
	
		
			
				
					|  |  |  |  |     // console.log('appendChar:', c, this.keybufs)
 | 
			
		
	
		
			
				
					|  |  |  |  |   }; | 
			
		
	
		
			
				
					|  |  |  |  |   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 == "Delete" || ev.key == "Backspace") { | 
			
		
	
		
			
				
					|  |  |  |  |       this.dom.innerTex = ""; | 
			
		
	
		
			
				
					|  |  |  |  |       this.appendChar("delete"); | 
			
		
	
		
			
				
					|  |  |  |  |       this.completeInput(); //立即完成输入
 | 
			
		
	
		
			
				
					|  |  |  |  |     } else { | 
			
		
	
		
			
				
					|  |  |  |  |       if (ev.key.length == 1) { | 
			
		
	
		
			
				
					|  |  |  |  |         var charCode = ev.key.charCodeAt(0); | 
			
		
	
		
			
				
					|  |  |  |  |         // console.log("key="+charCode);
 | 
			
		
	
		
			
				
					|  |  |  |  |         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 { | 
			
		
	
		
			
				
					|  |  |  |  |             if (ev.key.length == 1) { | 
			
		
	
		
			
				
					|  |  |  |  |                 var charCode = ev.key.charCodeAt(0); | 
			
		
	
		
			
				
					|  |  |  |  |                 // console.log("key="+charCode);
 | 
			
		
	
		
			
				
					|  |  |  |  |                 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();
 | 
			
		
	
		
			
				
					|  |  |  |  |           this.appendChar(ev.key); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |     }; | 
			
		
	
		
			
				
					|  |  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |  |       //忽略其他控制键
 | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  |   }; | 
			
		
	
		
			
				
					|  |  |  |  |   KeyScaner.prototype.onKeyUp = function (ev) { | 
			
		
	
		
			
				
					|  |  |  |  |     this.lastTime = new Date().getTime(); | 
			
		
	
		
			
				
					|  |  |  |  |     if (ev.charCode === 29) { | 
			
		
	
		
			
				
					|  |  |  |  |       var str = this.altBuf.join(""); | 
			
		
	
		
			
				
					|  |  |  |  |       var num = parseInt(str); | 
			
		
	
		
			
				
					|  |  |  |  |       var c = String.fromCharCode(num); | 
			
		
	
		
			
				
					|  |  |  |  |       this.appendChar(c); | 
			
		
	
		
			
				
					|  |  |  |  |       this.altBuf = []; | 
			
		
	
		
			
				
					|  |  |  |  |       console.log('onKeyUp success:', ev.charCode, this.keybufs); | 
			
		
	
		
			
				
					|  |  |  |  |     } else 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.onKeyPress = function (ev) { | 
			
		
	
		
			
				
					|  |  |  |  |     this.lastTime = new Date().getTime(); | 
			
		
	
		
			
				
					|  |  |  |  |     const char = String.fromCharCode(ev.charCode); | 
			
		
	
		
			
				
					|  |  |  |  |     console.log('KeyPress:', ev.charCode, char); | 
			
		
	
		
			
				
					|  |  |  |  |     /** | 
			
		
	
		
			
				
					|  |  |  |  |      * 释放资源 | 
			
		
	
		
			
				
					|  |  |  |  |      *   if (ev.charCode === 29) { | 
			
		
	
		
			
				
					|  |  |  |  |       this.appendChar(char); | 
			
		
	
		
			
				
					|  |  |  |  |       // console.log('KeyPress success:', ev.charCode, this.keybufs);
 | 
			
		
	
		
			
				
					|  |  |  |  |     } else | 
			
		
	
		
			
				
					|  |  |  |  |      */ | 
			
		
	
		
			
				
					|  |  |  |  |     KeyScaner.prototype.dispose = function () { | 
			
		
	
		
			
				
					|  |  |  |  |         this.dom.removeEventListener('keydown', this.onKeyDown); | 
			
		
	
		
			
				
					|  |  |  |  |         this.dom.removeEventListener('keyup', this.onKeyUp); | 
			
		
	
		
			
				
					|  |  |  |  |         clearInterval(this.interval); | 
			
		
	
		
			
				
					|  |  |  |  |     }; | 
			
		
	
		
			
				
					|  |  |  |  |     return KeyScaner; | 
			
		
	
		
			
				
					|  |  |  |  |     if (char == '\n') { | 
			
		
	
		
			
				
					|  |  |  |  |       this.completeInput(); | 
			
		
	
		
			
				
					|  |  |  |  |     } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     // if (ev.charCode === 49) {
 | 
			
		
	
		
			
				
					|  |  |  |  |     //   const char = String.fromCharCode(ev.charCode);
 | 
			
		
	
		
			
				
					|  |  |  |  |     //   this.appendChar(char);
 | 
			
		
	
		
			
				
					|  |  |  |  |     // }
 | 
			
		
	
		
			
				
					|  |  |  |  |   }; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |   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); | 
			
		
	
		
			
				
					|  |  |  |  |     this.dom.removeEventListener('keypress', this.onKeyPress); | 
			
		
	
		
			
				
					|  |  |  |  |     clearInterval(this.interval); | 
			
		
	
		
			
				
					|  |  |  |  |   }; | 
			
		
	
		
			
				
					|  |  |  |  |   return KeyScaner; | 
			
		
	
		
			
				
					|  |  |  |  | }()); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | export default { | 
			
		
	
		
			
				
					|  |  |  |  |     KeyScaner | 
			
		
	
		
			
				
					|  |  |  |  |   KeyScaner | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |