angular - Angular document.addEventListener 监听外部点击
问题描述
我有一些代码可以监听元素内部和外部的点击..
这是javascript上的代码。
document.addEventListener('click', (event) => {
const isClickInside = this.nav.contains(event.target);
if (!isClickInside) {
if (this.dropdown.style.display === 'grid') {
this.dropdown.style.display = 'none';
this.button.innerHTML = 'menu';
}
}
});
当我把它放在 ngOnInit 中时,这有效......但我想知道如何以角度方式完成。我正在使用 Angular 11 顺便说一句。
我该怎么做?
解决方案
您可以使用HostListener
为组件内部和外部的每个单击事件创建一个处理程序
@HostListener("click", ["$event"]) inClick(e: MouseEvent) {
e.stopPropagation();
this.clickStatus = "inside click";
}
@HostListener("document:click") outClickHandler() {
this.clickStatus = "outside click";
}
e.stopPropagation() 防止组件内部的点击事件冒泡到父元素,否则会触发outClickHandler
另一种方法是使用与您的问题相同的单一方法
零件
export class NavComponent {
clickStatus = "";
// ElementRef : a wrapper around a native element inside of a View.
constructor(private el: ElementRef) {}
@HostListener("document:click", ["$event"]) outClickHandler(e: MouseEvent) {
if (this.el.nativeElement.contains(e.target)) {
this.clickStatus = "inside click";
} else {
this.clickStatus = "outside click";
}
}
推荐阅读
- eclipse - 运行时 TestNG 出现错误“在:“启动测试文件”期间发生内部错误
- python - 如何在不更改这些条形宽度的情况下近似图表的条形?(Matplotlib)
- django - 从 sqlite 迁移到 postgree 后,Django value too long for type character varying(20) 错误
- ssh - 无法创建隧道并连接到 jupyter 接口
- r - 如何在 r 中获得逻辑回归中的所有因子系数?
- android - HTML 按钮在除 Android 应用程序之外的任何地方都可以使用
- amazon-web-services - 如何允许私有子网 VPC 中的 AWS lambda 资源在不使用 NAT 的情况下与 Internet 通信?
- kubernetes - 我用 kubeadm 创建了一个主集群,一切都很好,但 CoreDNS 没有工作
- php - PHPUnit 单元测试:在方法中处理 session_start()
- coldfusion - 如何使用 Mailgun Rest API Coldfusion 发送 iCal 邀请