Html 角度-防止禁用按钮上的单击事件
我试图阻止禁用按钮上的单击事件,换句话说,阻止删除禁用属性的某些用户调用某些操作 目前,我有以下代码来执行此操作:Html 角度-防止禁用按钮上的单击事件,html,angular,typescript,dom-events,Html,Angular,Typescript,Dom Events,我试图阻止禁用按钮上的单击事件,换句话说,阻止删除禁用属性的某些用户调用某些操作 目前,我有以下代码来执行此操作: 执行操作 工作正常,但这不是一个好的解决方案,因为我必须为我的应用程序中的所有按钮执行此操作(相信我,很容易忘记执行此操作,即使是一个Linter也帮不了我) 为了寻找更可靠的解决方案,我认为指令可以帮助我: import { Directive, HostListener, Input, Renderer2, ElementRef } from '@angular/core';
执行操作
工作正常,但这不是一个好的解决方案,因为我必须为我的应用程序中的所有按钮执行此操作(相信我,很容易忘记执行此操作,即使是一个Linter也帮不了我)
为了寻找更可靠的解决方案,我认为指令
可以帮助我:
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
}
}
}
执行操作
…然而,它完全不起作用。它不会阻止单击事件。是否有任何解决方案,我不必在其调用中控制操作本身
防止禁用按钮上的单击事件
如果禁用了属性
,则不会发生单击
当用户决定使用devtools时
但是,如果用户编辑HTML并手动删除禁用的属性,则会发生单击。您可以尝试按照建议进行检查,但浏览器是一个不安全的环境。用户仍然能够代表网页执行任何代码,而不考虑您可能进行的任何前端检查
防止禁用按钮上的单击事件
如果禁用了属性
,则不会发生单击
当用户决定使用devtools时
但是,如果用户编辑HTML并手动删除禁用的属性,则会发生单击。您可以尝试按照建议进行检查,但浏览器是一个不安全的环境。用户仍然能够代表网页执行任何代码,而不考虑您可能进行的任何前端检查 在您的指令中,您可以这样做。您可以通过在捕获阶段向父级添加事件侦听器来实现
ngOnInit() {
this.elementRef.nativeElement.parentElement.addEventListener('click',(e) => {
if(this._disabled && e.target.tagName === 'BUTTON') {
e.stopImmediatePropagation();
e.stopPropagation();
}
}, true);
}
您可以在指令的ondestory
中删除侦听器,您可以这样做。您可以通过在捕获阶段向父级添加事件侦听器来实现
ngOnInit() {
this.elementRef.nativeElement.parentElement.addEventListener('click',(e) => {
if(this._disabled && e.target.tagName === 'BUTTON') {
e.stopImmediatePropagation();
e.stopPropagation();
}
}, true);
}
您可以在onDestroy
dev_054我的ans有帮助吗?dev_054我的ans有帮助吗?感谢您的回答,这是一个有趣的解决方案,但是它可以阻止任何对父对象的单击,例如,使用单击的div。样本:是的,明白了,但如果你能把你的按钮包装成div或任何其他标签。这就解决了问题。再更新一次答案,以检查targe是否为按钮。感谢您的回答,这是一个有趣的解决方案,但是它阻止了任何对父项的单击,甚至是带有单击的div
。样本:是的,明白了,但如果你能把你的按钮包装成div或任何其他标签。这就解决了问题。再更新一次答案,检查targe是否为按钮。嘿@basarat,是的,我知道如果不使用devtools,禁用的按钮不会触发单击
,但是OP就是这样。我正在寻找一个与我所介绍的不同的解决方案。我不想在每个组件上控制它。如果问题不清楚,请告诉我。嘿@basarat,是的,我知道如果您不使用devtools,禁用的按钮不会触发单击
,但是OP就是这样。我正在寻找一个与我所介绍的不同的解决方案。我不想在每个组件上控制它。如果问题不清楚,请告诉我。
ngOnInit() {
this.elementRef.nativeElement.parentElement.addEventListener('click',(e) => {
if(this._disabled && e.target.tagName === 'BUTTON') {
e.stopImmediatePropagation();
e.stopPropagation();
}
}, true);
}