可拖动按钮时如何将单击事件设置为禁用?

Posted

技术标签:

【中文标题】可拖动按钮时如何将单击事件设置为禁用?【英文标题】:How can I set the click event to disabled when draggable a button? 【发布时间】:2021-10-11 04:18:46 【问题描述】:

我创建了一个可移动的.directive.ts,您可以使用它在前端移动对象。到目前为止,该指令也有效。不幸的是,当我移动按钮时,我的点击事件总是打开。有没有办法在可拖动的开始处停用单击并在可拖动的结束处重新激活它?我的 Stackblitz:https://stackblitz.com/edit/draggable-system-azomjp?file=app%2Fapp.component.html

我的代码:

// movable.directive.ts
 @Input('appMovable') set movable(movable: boolean) 
    this.enabled = movable;
  

  @HostListener('dragStart', ['$event']) onDragStart(event: PointerEvent): void 
    this.moving = true;
    this.startPosition = 
      x: event.clientX - this.position.x,
      y: event.clientY - this.position.y
    ;
  

  @HostListener('dragMove', ['$event']) onDragMove(event: PointerEvent): void 
    this.position = 
      x: event.clientX - this.startPosition.x,
      y: event.clientY - this.startPosition.y,
    ;
  

  @HostListener('dragEnd') onDragEnd(): void 
    this.moving = false;

    if (this.reset) 
      this.position = 
        x: 0,
        y: 0,
      ;
    
  
// HTML
<button (click)="openAlert()" [appMovable]="true">
  My Button
</button>
// TS
openAlert() 
    alert("Hello World!");
  

【问题讨论】:

【参考方案1】:

似乎在 Github 上一直在讨论这个问题,还有一个通过 rxjs 使用 fromEvent 的示例,但我在你的 stackblitz 中没有成功使用它。

https://github.com/angular/angular/issues/9587


作为替代方案,这个粗略的 POC 展示了您可以通过执行以下操作来完成此任务的一种方法。

DI Renderer2 in moveable.directive.ts

constructor(public element: ElementRef, private sanitizer: DomSanitizer, private ren: Renderer2) 
    super();
  

然后在你的dragMove 中设置pointer-events: none

@HostListener('dragMove', ['$event']) onDragMove(event: PointerEvent): void 
    this.ren.setStyle(this.element.nativeElement, 'pointer-events', 'none');
    this.position = 

然后在你的dragEnd 中删除它

 @HostListener('dragEnd') onDragEnd(): void 
    this.ren.removeStyle(this.element.nativeElement, 'pointer-events');
    this.moving = false;

堆栈闪电战

https://stackblitz.com/edit/draggable-system-etearc?file=app/movable/moveable.directive.ts

【讨论】:

以上是关于可拖动按钮时如何将单击事件设置为禁用?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中的活动开始时禁用按钮的单击事件检查

如何禁用 android 布局的一种视图以便不发生点击事件?

如果禁用,则在悬停路由器按钮时禁用指针事件

React,如何防止在拖动后执行单击事件?

如何实现按钮单击事件 C#

在 jQuery UI 中克隆可拖动对象时,如何将数据和事件传输到新元素?