【问题标题】:Angular: how to get <li> rather than <ul> from click eventAngular:如何从点击事件中获取 <li> 而不是 <ul>
【发布时间】:2020-04-15 20:16:07
【问题描述】:

我有一个 Angular 组件,它的 &lt;ul&gt; 元素包含 &lt;li&gt; 元素。我有以下代码:

  @HostListener('document:mousedown', ['$event'])
  onMouseDown(event: MouseEvent): void {
    func();
  }

我希望func() 在我点击屏幕上的任意位置时执行除了 某些&lt;li&gt; 元素应用了disabled 类。我希望event.target 会返回我点击的&lt;li&gt;,这样我就可以做类似的事情

if (!event.target.disabled) {
    func()
}

问题是event.target 返回&lt;ul&gt; 而不是&lt;li&gt;。这是我的模板:

<div>
  <ul>
    <ng-container>
      <ng-template>
        <li>
        <li class="disabled">
        <li>
      </ng-template>
    </ng-container>
  </ul>
</div>

此模板无法更改,因为它是其他人代码的一部分。

有谁知道如何解决这个问题?

【问题讨论】:

  • 你能分享你的组件模板吗?看到这将有助于回答
  • @SergeyRudenko 我已经更新了我的帖子。
  • 哦,好的,我知道问题是 li 元素在 shadow dom 内部?
  • 我对 shadow dom 了解不多 :)
  • 你能提供更多细节吗????????

标签: javascript html css angular


【解决方案1】:

你能试试这个方法吗:

https://stackblitz.com/edit/angular-kfonyy

  @HostListener('document:click', ['$event'])
  onMouseDown(event): void {
    this.func(event.target)
  }

  func(element) {
    if (element.tagName == ‘LI’ && element.classList.contains('disabled')) {
      console.log("clicked disabled li")
    } else {
      console.log("clicked elsewhere")
    }
  }

【讨论】:

  • 我认为您还需要检查元素是否为 li 否则该 func 将无法在任何已禁用类的元素上工作??
  • 同意,我认为这也取决于用例,可能需要更多检查:)
  • 你说得对,我问了关于这个问题的更多细节,但我们提供了一个基于 RNdev 给出的答案,干得好?
【解决方案2】:

一个简单的解决方案是将这些禁用的元素绑定到 mousedown 事件并调用event.stopPropagation() 方法。

模板

<li class="disabled" (mousedown)="handler($event)">click</li>

组件

handler(e:MouseEvent){
      e.stopPropagation();   
}

demo ??

更新!!

你仍然可以通过使用这样的指令和目标事件来做同样的事情

@Directive({
  selector: '[prevEvents]'
})
export class PrevEventsDirective {

  @HostListener("mousedown", ["$event"]) 
  @HostListener("mouseup", ["$event"]) 
  @HostListener("click", ["$event"]) 
  public handler(e:MouseEvent) {
    e.stopPropagation();
  }

}

模板

<li class="disabled" prevEvents>click</li>

demo ?

【讨论】:

  • 感谢演示。我发现它和我的应用程序之间的区别在于我的 HostListener keydown 侦听器在 handler() 之前首先触发。 HostListener 关闭元素,因此 handler() 没有机会触发。如果我在 HostListener 上使用 300 秒执行“setTimeOut()”,HostListener 会延迟足够长的时间以使其正常工作,但任何小于 200 秒的时间都会失败。关于如何处理的任何想法?
  • 我完全迷路了,你不要在问题中告诉这个??什么是必须禁用的事件
  • @RNdev 我已经用指令更新了答案,如果这对你不起作用,你可以用更多细节来澄清你的问题,所以我们可以帮助??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多