angular - Angulars HostListener 干扰了聚焦的 HTML 对象
问题描述
我有两个组件,NavBarComponent
和FooComponent
.
我附加了一个HostListener并且FooComponent
我在NavBarComponent
.
FooComponent
@HostListener('document:keydown', ['$event'])
onKeydownHandler(event: KeyboardEvent): void {
switch (event.code) {
case 'ArrowLeft': {
/* do something in this component */
$event.stopPropagation();
break;
}
}
});
尽管从导航组件document.activeElement
返回<input ...>
字段,但 FooComponent 会使用该<-- arrow left
事件。
当然,这是因为我调用stopPropagation
了 ,但我假设侦听器根本不会收到事件,因为输入字段具有焦点。我在这里错过了什么吗?
解决方案
它确实得到了事件,因为'document:keydown'
(or 'window:keydown'
) 是一个全局钩子。
您可能想要做的是FooComponent
在 DOM 中的 DOM 或其任何子代不是目标时跳过您的代码。像这样的东西:
@HostListener('document:keydown', ['$event'])
onKeydownHandler(event: KeyboardEvent): void {
switch (event.code) {
case 'ArrowLeft': {
if (this.elemRef.nativeElement.contains(event.target)) {
/* do something in this component */
event.stopPropagation();
break;
}
}
}
};
然后在构造函数中添加这个依赖:
constructor(
private elemRef: ElementRef,
这应该允许您在输入框中使用左箭头键NavBarComponent
。
顺便说一句,对我来说,在 Chrome 中,事件实际上并没有被阻止,直到我也return false;
立即添加event.stopPropagation();
. 据我所知,当你想取消一个事件时,返回一个错误的值总是一个好习惯。
推荐阅读
- python - 安装后的 TensorFlow-GPU 错误(Windows 10)
- c++ - 使用 std::string.find() 将我带到 std::out_of_range
- python - Moviepy 在连接后的前几帧后冻结
- javascript - 如何使socket.io只连接一次
- tcl - 为什么我不能在 tcl 中访问正确的 pi 值?
- css - 添加类以选择标签
- python - numpy 数组字典到(转置)csv
- javascript - 您应该如何存储多行文本文件?作为文本文件还是js文件?
- javascript - 使用 Axios 模块设置 Nuxt 项目
- linux - Shell 脚本回显问题