我如何在整个页面上收听按键事件?

L.q*_*ter 86 keypress key-bindings typescript angular

我正在寻找一种方法将函数绑定到我的整个页面(当用户按下一个键时,我希望它在我的conponent.ts中触发一个函数)

在Angular 1中它很容易ng-keypress但是它没有用(keypress)="handleInput($event)".

我在整个页面上使用div包装器尝试了它,但它似乎不起作用.它只适用于焦点在它上面.

<div (keypress)="handleInput($event)" tabindex="1">
Run Code Online (Sandbox Code Playgroud)

谢谢!

yur*_*zui 165

我会在你的组件中使用@HostListener装饰器:

import { HostListener } from '@angular/core';

@Component({
  ...
})
export class AppComponent {

  @HostListener('document:keypress', ['$event'])
  handleKeyboardEvent(event: KeyboardEvent) { 
    this.key = event.key;
  }
}
Run Code Online (Sandbox Code Playgroud)

还有其他选项,如:

@Component装饰器内的主机属性

Angular建议@HostListener在主机属性https://angular.io/guide/styleguide#style-06-03上使用装饰器

@Component({
  ...
  host: {
    '(document:keypress)': 'handleKeyboardEvent($event)'
  }
})
export class AppComponent {
  handleKeyboardEvent(event: KeyboardEvent) {
    console.log(event);
  }
}
Run Code Online (Sandbox Code Playgroud)

renderer.listen

import { Component, Renderer2 } from '@angular/core';

@Component({
  ...
})
export class AppComponent {
  globalListenFunc: Function;

  constructor(private renderer: Renderer2) {}

  ngOnInit() {
    this.globalListenFunc = this.renderer.listen('document', 'keypress', e => {
      console.log(e);
    });
  }

  ngOnDestroy() {
    // remove listener
    this.globalListenFunc();
  }
}
Run Code Online (Sandbox Code Playgroud)

Observable.fromEvent

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/fromEvent';
import { Subscription } from 'rxjs/Subscription';

@Component({
  ...
})
export class AppComponent {
  subscription: Subscription;

  ngOnInit() {
    this.subscription = Observable.fromEvent(document, 'keypress').subscribe(e => {
      console.log(e);
    })
  }

  ngOnDestroy() {
    this.subscription.unsubscribe();
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的光临,但是对于未来的读者来说只是一个方向:如果您需要箭头键,请使用keydown而不是按键. (15认同)
  • 如果你需要`esc`键,请使用`keyup`事件.感谢@TroelsLarsen (11认同)
  • 工作正常。import {HostListener } from '@angular/core' 必须添加。甚至可以在组件中的任何地方调用。即使是外部构造器也工作正常 (2认同)
  • @yurzui 如何检测“功能键”(F1、F2、F3,...)? (2认同)

Ada*_*dam 16

yurzui的回答对我不起作用,它可能是一个不同的RC版本,或者它可能是我的错误.无论哪种方式,这是我在Angular2 RC4中使用我的组件的方式(现在已经过时了).

@Component({
    ...
    host: {
        '(document:keydown)': 'handleKeyboardEvents($event)'
    }
})
export class MyComponent {
    ...
    handleKeyboardEvents(event: KeyboardEvent) {
        this.key = event.which || event.keyCode;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是相同的,只是替代语法,你使用`keydown`而不是`keypress` (3认同)

tsh*_*ake 14

只是为了在 2019 年加入 Angular 8,

我不得不使用 keydown 而不是 keypress

@HostListener('document:keypress', ['$event'])
Run Code Online (Sandbox Code Playgroud)

@HostListener('document:keydown', ['$event'])
Run Code Online (Sandbox Code Playgroud)

工作堆栈


Pra*_*rya 5

如果您想在任何特定键盘按钮按下时执行任何事件,在这种情况下,您可以使用@HostListener。为此,您必须在组件 ts 文件中导入 HostListener。

从'@angular/core' 导入 { HostListener };
然后在组件 ts 文件中的任何位置使用以下函数。

@HostListener('document:keyup', ['$event'])
  handleDeleteKeyboardEvent(event: KeyboardEvent) {
    if(event.key === 'Delete')
    {
      // remove something...
    }
  }
Run Code Online (Sandbox Code Playgroud)