javascript - event.preventDefault() 或 event.stopPropagation() 不适用于 keyUp 事件

标签 javascript angular typescript angular-directive angular10

指令文件:我正在尝试这样做,如果我的计数器超过两个,它应该停止事件或 keyUp 来反射(reflect),但它不起作用。有人可以帮我解决这个问题吗?

import { Component, HostListener, HostBinding } from '@angular/core';
import { ActivatedRoute } from '@angular/router';

export enum KeyCodes {
  LEFT = 37,
  RIGHT = 39,
}

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})
export class AppComponent {
  counter: number = 0;
  fragment: string;
  classBorder: string = '';

  constructor(private _route: ActivatedRoute) {
    // this.fragment = _route.snapshot.fragment;
  }

  @HostListener('document:keyup', ['$event'])
  KeyUpEvent(event: KeyboardEvent) {
    if (event.keyCode == KeyCodes.LEFT) this.counter--;
    if (event.keyCode == KeyCodes.RIGHT) this.counter++;

    if (this.counter > 2) {
      event.preventDefault();
      event.stopPropagation();
    }
  }
}

最佳答案

您可能希望在 OnInit 中为事件创建一个可观察对象,然后通过管道将其仅获取发出的前 2 个值:

export class AppComponent implements OnInit {

  ngOnInit() {
    fromEvent(document, 'keydown').pipe(
      filter((e: KeyboardEvent) => e.keyCode === KeyCodes.LEFT),
      take(2),
    ).subscribe(
      (x: KeyboardEvent) => console.log(x)
    )
  }
}

preventDefault() 仅禁用浏览器的默认行为,它通常用于防止某些事件和类似事件的刷新。

您还可以使用 takeUntil() 等待另一个可观察对象触发,以实现像您这样稍微复杂的逻辑。

counter = 0
countSubject = new Subject

get count$() {
  return this.countSubject.asObservable()
}

ngOnInit() {
  fromEvent(document, 'keydown').pipe(
    tap((e: KeyboardEvent) => {
      if (e.keyCode === KeyCodes.LEFT) {
        this.countSubject.next(++this.counter)
      }
      if (e.keyCode === KeyCodes.RIGHT) {
        this.countSubject.next(--this.counter)
      }
    }),
    takeUntil(this.count$.pipe(
      filter((v:number) => v === 2)
    )),
  ).subscribe(
    (x: KeyboardEvent) => console.log(x)
  )
}

我在 Stackblitz 上做了一个工作示例为你。

关于javascript - event.preventDefault() 或 event.stopPropagation() 不适用于 keyUp 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72222702/

相关文章:

javascript - 使用类和原型(prototype)模式未定义组件的属性

javascript 在访问的第三页上弹出弹出窗口

Angular 动态模块提供者

reactjs - 函数后的 Javascript 中的冒号是什么意思?

javascript - 如何使用 jQuery 检查我是否正在离开另一个网站?

javascript - 如何启用/禁用提交按钮,仅当提供两个条件时 : checking input radio and filling input text

angular - 将 ReactiveFormsModule 添加到我的 Angular 4 应用程序后,没有获得 NgControl 错误的提供者

angular - 在 ionic 2 应用程序中使用 promise with observable

node.js - 使用配置文件导入 Typescript 模块

javascript - 从元素中获取 HTMLElement