Pesquisa de site

javascript - Typescript: criar KeyboardEvent e ativar/desativar a qualquer momento


Eu gostaria de ser capaz de lidar com eventos de teclado, mas também ser capaz de parar/iniciar o manuseio deles novamente conforme eu desejar dentro do meu código.

Tenho lido a documentação MDN da Mozilla sobre o KeyboardEvent, e da forma como ele herda de Event vejo que posso usar alguns métodos úteis para o que quero alcançar, tais como:

  • event.initEvent
  • event.preventDefault

Mas depois de alguma pesquisa e tentando juntar as coisas, estou tendo dificuldades e não consigo encontrar a maneira de fazer isso.

Apenas para provar que tentei descobrir como e trabalhei na minha solução, gostaria de mostrar a você o que tenho até agora:

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);
  }

}

Resposta #1

Depois de trabalharmos juntos, chegamos a esta solução:

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'
  }
}

Resposta #2

Talvez o evento seja "isComposing" (booleano, verdadeiro se estiver compondo) fonte: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent