javascript - Typescript: opprett KeyboardEvent og aktiver/deaktiver det når som helst


Jeg vil gjerne kunne håndtere tastaturhendelser, men også kunne stoppe/starte håndteringen av dem igjen som jeg ønsker inne i koden min.

Jeg har lest gjennom MDN Mozilla-dokumentasjonen om KeyboardEvent, og måten det arver fra Event på ser jeg at jeg kan bruke noen nyttige metoder for det jeg ønsker å oppnå, slik som:

  • event.initEvent
  • event.preventDefault

Men etter litt research og å ha prøvd å sette ting sammen, sliter jeg og klarer ikke å finne ut hvordan jeg skal gjøre det.

Bare for å bevise at jeg har prøvd å finne ut hvordan og jobbet med løsningen min, vil jeg gjerne vise deg hva jeg har så langt:

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

}

Svar #1

Etter å ha jobbet sammen kom vi fram til denne løsningen:

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

Svar #2

Kanskje hendelsen er «isComposing» (boolean, sann hvis det komponeres) font: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent