Angular 2 HostListener按键检测转义键?

Jer*_*rst 39 javascript escaping keypress angular

我使用以下方法来检测页面上的按键.我的计划是检测何时按下Escape键并运行方法(如果是).目前我只是想记录按下哪个键.但是,永远不会检测到Escape键.

@HostListener('document:keypress', ['$event'])
handleKeyboardEvent(event: KeyboardEvent) {
  console.log(event);
  let x = event.keyCode;
  if (x === 27) {
      console.log('Escape!');
  }
}
Run Code Online (Sandbox Code Playgroud)

Saw*_*ant 76

尝试使用keydownkeyup事件来捕获Esc密钥.从本质上讲,您可以替换document:keypressdocument:keydown.escape:

@HostListener('document:keydown.escape', ['$event']) onKeydownHandler(event: KeyboardEvent) {
    console.log(event);
}
Run Code Online (Sandbox Code Playgroud)

  • 事件规范如何工作?`document:keydown.escape` 似乎相当随意。是否有关于有效语法的文档?我什至无法在 Angular 中找到 HostListener 指令功能的正确实现,监听器似乎深埋在内部。 (2认同)

Gau*_*via 31

它使用以下代码为我工作:

const ESCAPE_KEYCODE = 27;

@HostListener('document:keydown', ['$event']) onKeydownHandler(event: KeyboardEvent) {
    if (event.keyCode === ESCAPE_KEYCODE) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

或以较短的方式:

@HostListener('document:keydown.escape', ['$event']) onKeydownHandler(evt: KeyboardEvent) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,KeyCode正在[不建议使用](https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode),您可以使用[event.key](https:// developer. mozilla.org/en-US/docs/Web/API/KeyboardEvent/key)并匹配字符串"Escape".无需使用代码,具有使代码易于阅读的副作用. (3认同)

ktr*_*yak 11

就我而言(使用 Angular 10)可以很好地通过 console.log()keydown.escape跟踪事件:escape

@HostListener('keydown.escape')
fn() {
 console.log();
}
Run Code Online (Sandbox Code Playgroud)

但 Angular 变化检测器只能在keyup.escape.

  • 我需要让这个“@HostListener('document:keydown.escape')”才能工作,受到@Gibolt的启发 (2认同)

Gib*_*olt 8

现代的方法

@HostListener('document:keydown', ['$event']) onKeydownHandler(event: KeyboardEvent) {
    if (event.key === "Escape") {
        // Do things
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在 IE 11 中不起作用,其中该键称为“Esc”: if (event.key === "Escape" || event.key === "Esc") (2认同)
  • 接得好!公平地说,标题是“现代”:D (2认同)
  • 当使用带有角度组件的条形码扫描仪时,我在持续捕获字符代码 13(输入键)时遇到问题。从 keypress 更改为 keydown 为我解决了这个问题。 (2认同)

小智 5

Angular 通过 @HostListener 装饰器使这一切变得简单。这是一个函数装饰器,接受事件名称作为参数。当该事件在宿主元素上触发时,它会调用关联的函数。

@HostListener('document:keydown.escape', ['$event']) onKeydownHandler(event: 
    KeyboardEvent) {
    this.closeBlade();
   }
Run Code Online (Sandbox Code Playgroud)