Typescript:随时创建 KeyboardEvent 和 activate/deactivate

Typescript: create KeyboardEvent and activate/deactivate it at anytime

我希望能够处理键盘事件,但也希望能够 stop/start 在我的代码中再次处理它们。

我一直在通读 MDN Mozilla Docs 关于 KeyboardEvent 的内容,以及它从 Event 继承的方式 我发现我可以使用一些有用的方法来实现我想要的实现如:

但经过一些研究并尝试将所有东西放在一起后,我很挣扎,但最终无法找到实现它的方法。

为了证明我已经尝试弄清楚我的解决方案是如何工作的,我想向您展示我目前所拥有的:

class Game {

  private gameOver: boolean = false;
  private timeOfRoundMillis: number = 5 * 1000;
  private keyboardEvent: KeyboardEvent;
  private capturedInput: string[];

  constructor() {}

  public play(): void {
    this.round();
  }

  private round(): void {

    if (!this.gameOver) {

      // I want to start capturing keys
      keyboardEvent.initEvent();

      setTimeout(() => {
        // Now I want to stop capturing keys to process the input
        keyboardEvent.preventDefault();

        this.processPlayerInput();
        this.emptyCapturedInput();
        this.round();
      }, this.timeOfRoundMillis);

    }

  }

  private processPlayerInput(): void {
      // do some stuff with 'capturedInput'
  }

  // I want to call this every time a key is pressed if 
  // capturing keyboard events is active
  private capture(e): void {
     capturedInput.push(e.keyPressed);
  }

}

也许事件是 "isComposing"(布尔值,如果正在组合则为真) 字体:https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent

经过共同努力,我们得出了这个解决方案:

var keypress = require('keypress');

declare var process: any;

class Game {

  private gameOver: boolean = false;
  private timeOfRoundMillis: number = 5 * 1000;
  private capturedInput: string[];

  constructor() {
     keypress(process.stdin);

     process.openStdin().on('keypress', (key) => {
         // I want to call this every time a key is pressed
         this.capturedInput.push(key);
     });
     process.stdin.setRawMode(true);
  }

  public play(): void {
    this.round();
  }

  private round(): void {

    if (!this.gameOver) {

      setTimeout(() => {
        // Now I want to stop capturing keys to process the input
        this.isCapturingKeys = false;  // need to set it to true when you desire to start capturing again
        this.processPlayerInput();
        this.emptyCapturedInput();
        this.round();
      }, this.timeOfRoundMillis);

    } else {
       process.stdin.pause(); // close stdin events
    }

  }

  private processPlayerInput(): void {
      // do some stuff with 'capturedInput'
  }
}