mis*_*sha 14 innerhtml event-bubbling typescript angular2-template angular
我有一个事件冒泡的情况.示例:
<td (click)="doSomething()">
<text [innerHtml]="content">
// content of innerHtml is : <a href="http://google.com"></a>
</text>
</td>
Run Code Online (Sandbox Code Playgroud)
标签通过innerHtml从另一个组件呈现.问题:当我点击链接时,也会触发元素的click事件.如何解决问题(停止传播doSomething()),知道事件处理程序(或任何角度2代码)不能通过innerHtml传递?
谢谢!
Pan*_*kar 21
解决方法可能只是放置(click)="$event.stopPropagation()"
在text
组件上,以便事件不会从托管组件冒出来.同样的事情可以通过写一个即兴创作Directive
.
<td (click)="doSomething()">
<text (click)="$event.stopPropagation()" [innerHtml]="content">
// content of innerHtml is : <a href="http://google.com"></a>
</text>
</td>
Run Code Online (Sandbox Code Playgroud)
你可以利用冒泡.从您的处理程序中,您可以event.target
查看是否A
已单击,如果是,请跳过您的操作.
但要小心,因为event.target
可能是SPAN
!您不仅需要检查事件的目标是否是A
标记,还需要在简单的冒泡模拟中查看DOM树.
所以这里有可能的解决方案:
模板
(click)="doSomething($event)"
Run Code Online (Sandbox Code Playgroud)
零件
export class AppComponent {
content = '<a href="http://google.com">Link text <span>Nested text</span></a>'
doSomething(e) {
let target = e.target;
while (target !== e.currentTarget) {
if (target.tagName == 'A') return;
target = target.parentNode;
}
alert('do something')
}
}
Run Code Online (Sandbox Code Playgroud)
您可以$event
如下使用对象:
<a (click)="stopPropagation($event);false" //<<<----added click event
href="http://google.com">
</a>
stopPropagation(event: Event){
event.stopPropagation();
...
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
14217 次 |
最近记录: |