typescript Angular -防止禁用按钮上的点击事件

4si2a6ki  于 2023-06-24  发布在  TypeScript
关注(0)|答案(4)|浏览(137)

我试图阻止禁用按钮上的单击事件,换句话说,防止一些删除禁用属性的用户调用某些操作。
现在,我有下面的代码来做这件事:

<button [disabled]="someCondition" (click)="executeAction()">Execute action</button>
executeAction(): void {
  if (this.someCondition) return;

  // ...
}

工作,但它不是一个好的解决方案,因为我必须为我的应用程序中的所有按钮做这件事(相信我,很容易忘记这样做,甚至 Linter 不能帮助我在这里)。
在寻找更强大的解决方案时,我认为directive可以帮助我:

import { Directive, HostListener, Input, Renderer2, ElementRef } from '@angular/core';

@Directive({
  selector: 'button'
})
export class ButtonDirective {
  @Input() set disabled(value: boolean) {
    this._disabled = value != null;
    this.renderer2.setAttribute(this.elementRef.nativeElement, 'disabled', `${this._disabled}`);
  }

  private _disabled: boolean;

  constructor(
    private readonly elementRef: ElementRef,
    private readonly renderer2: Renderer2
  ) { }

  @HostListener('click', ['$event'])
  onClick(mouseEvent: MouseEvent) {
    // nothing here does what I'm expecting
    if (this._disabled) {
      mouseEvent.preventDefault();
      mouseEvent.stopImmediatePropagation();
      mouseEvent.stopPropagation();

      return false; // just for test
    }
  }
}
<button [disabled]="someCondition" (click)="executeAction()">Execute action</button>
executeAction(): void {
  console.log('still being called');
}

……但是它什么也没做。它不会阻止click事件。有没有什么解决方案,我不必在调用中控制动作本身?
STACKBLITZ

dauxcl2d

dauxcl2d1#

这是一个CSS的解决方案,比脚本便宜。
你可以很容易地使用

pointer-events: none;

在这种情况下,按钮将不可单击。
作为一个用户体验的增强,你也可以把你的按钮 Package 在一个 div 中,并给予这个div一个CSS属性

cursor: not-allowed;

这将显示被阻止的圆形图标,而不是正常的鼠标视图时,悬停。

wz1wpwve

wz1wpwve2#

在你的指令中,你可以这样做。您可以通过在捕获阶段向parent添加事件侦听器来实现它。

ngOnInit() {
    this.elementRef.nativeElement.parentElement.addEventListener('click',(e) => {
      if(this._disabled && e.target.tagName === 'BUTTON') {
        e.stopImmediatePropagation();
        e.stopPropagation();
      }
    }, true);
  }

您可以删除onDestroy中的侦听器

3ks5zfa0

3ks5zfa03#

在我们的项目中,以下操作可以防止禁用按钮的单击事件,而无需定义您自己的自定义事件:
组件模板:

<button class="btn"
[disabled]="disabled || inProgress">
<span (click)="disabled ? $event.stopPropagation() : undefined">
  <ng-content></ng-content>
</span>
</button>

适用于使用:

<app-button (click)="onClick()">
<span>Click me</span>
</app-button>
km0tfn4u

km0tfn4u4#

防止禁用按钮上的单击事件
如果有disabled属性,则不会发生单击。

当用户决定使用devtools时

但是,如果用户编辑HTML并手动删除禁用的属性,则单击将发生。您可以尝试按照您的建议进行检查,但浏览器是不安全的环境。用户仍然可以在网页上执行任何代码,而不管您可能会输入的任何 frontend 检查。

相关问题