我还没有找到在 Angular(或 Javascript)中本地执行此操作的方法,但这里有一种通用方法可以使其适用于所有点击处理程序。
虽然在概念上与其他答案相似,但其他答案不能很好地处理重复点击,并且不会在正确的时间维护(并重置!)他们的标志。
这里的想法是维护一个标志,用于在共享上下文(相同元素)的单击处理程序和 dblclick 处理程序之间做出决定:
- 点击处理程序会等待一小段时间以排除双击
- 双击处理程序在该等待期内阻止单击处理程序
- 因为双击意味着两个单单,在双击时,再次等待一小段时间再切换回标志,以确保第二个单击也被阻止
这是您在示例中使用它的方式:
<a (click)="method1()" (dblclick)="method2()"></a>
在你的组件内部:
const clickContext = new ClickContext();
class YourComponent {
method1 = clickContext.clickHandler(() => { /* your method1 */ });
method2 = clickContext.dblClickHandler(() => { /* your method2 */ });
}
对于需要 click 和 dblClick 处理程序的每个上下文(元素),您需要创建一个单独的上下文。幸运的是,这是一个罕见的要求。
现在,通过使用我将在下面介绍的魔法 util 类,可以正确处理单击和双击。
这是执行标志监视和处理程序执行的类:
export class ClickContext {
private isSingleClick = true;
clickHandler(handler: ClickHandler): ClickHandler {
return function() {
const args = arguments;
this.isSingleClick = true;
setTimeout(() => {
this.isSingleClick && handler.apply(undefined, args);
}, 250);
}
}
dblClickHandler(handler: ClickHandler): ClickHandler {
return function() {
const args = arguments;
this.isSingleClick = false;
setTimeout(() => {
this.isSingleClick = true;
}, 250);
handler.apply(undefined, args);
}
}
}
type ClickHandler = (...any) => void;
请注意,要注意确保将原始参数传递给目标事件处理程序方法 1 和方法 2。