【问题标题】:HostListener to analyse combination key pressHostListener 分析组合按键
【发布时间】:2017-11-06 06:31:38
【问题描述】:

我正在尝试跟踪用户何时使用键盘按下 Shift+Tab 组合键,但我无法触发该事件

@HostListener('keyup', ['$event'])
@HostListener('keydown', ['$event'])

onkeyup(event) {
  if (event.keyCode == 16 && event.keyCode == 9) {
    this.isShift = true;
    console.log("On Keyup " + event.keyCode);
  }
}

onkeydown(event) {
  console.log("On KeyDown" + event.keyCode);
}

【问题讨论】:

  • 您在此处的帖子实际上成为了我的问题的答案......如何收听鼠标事件或键盘事件。解决方案是在函数上堆叠 HostListener 注解。

标签: angular typescript


【解决方案1】:

虽然 Frank Modica 的解决方案有效,但使用 Angular's key event filtering and pseudo-events 将是一个更易读、更简洁的解决方案:

@Directive({
    selector: '[keyHandler]'
})
export class KeyHandlerDirective {

    @HostListener('keydown.shift.tab', ['$event'])
    onKeyDown(e) {
        // optionally use preventDefault() if your combination
        // triggers other events (moving focus in case of Shift+Tab)
        // e.preventDefault();
        console.log('shift and tab');
    }
}

// in template:
<input type="text" keyHandler />

更多关于伪事件如何工作的例子可以在here找到。

【讨论】:

  • Angular 的文档在这方面很糟糕,但这篇文章帮助了我:medium.com/claritydesignsystem/…
  • @azulBonnet 谢谢!
  • @MithunSudheendran 也许您想将此解决方案标记为已接受的答案?它比我的干净:)
【解决方案2】:

当我这样做时它会起作用:

@Directive({
  selector: '[test-directive]'
})
export class TestDirective {
  @HostListener('keydown', ['$event']) onKeyDown(e) {
    if (e.shiftKey && e.keyCode == 9) {
      console.log('shift and tab');
    }
  }
}

<input type="text" test-directive />

请注意keyup 可能很棘手,因为tab 可能会使元素失去焦点。所以当keyup 触发时,你可能在下一个元素上,所以keyup 实际上可能在那个元素上触发。所以这取决于你需要什么。但keydown 适用于当前元素。

【讨论】:

  • 是否可以在组件中使用测试指令?例如:我有 组件,我想跟踪该组件内的 Shift+Tab 事件
  • 是的,如果您将test-directive 放在包含可以触发keydown 事件的其他元素的元素上,它将起作用,因为事件会冒泡。请注意,非输入元素(如普通 div 元素可能不会触发 keydown 事件,除非您添加 tabindex。查看此链接:stackoverflow.com/questions/3149362/…
  • @FrankModica,如果我想捕获鼠标事件或键盘事件呢?谢谢。
  • @ArtanisZeratul 很抱歉我有一段时间没有处理这个问题了。也许你需要更多的 HostListeners。
猜你喜欢
  • 2017-07-09
  • 1970-01-01
  • 2017-02-25
  • 2016-07-03
  • 2016-12-06
  • 2022-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多