ngx自定义一个判断是否点击本节点的指令
来源:互联网 发布:东莞农村商业银行网络 编辑:程序博客网 时间:2024/05/24 05:57
写组件的时候经常要判断鼠标点击是否是本节点 所以 抽出来
废话少说直接上代码
import { Directive, ElementRef, EventEmitter, OnDestroy, OnInit, Output } from '@angular/core';/** * 是否点击的是本节点 * 如果点击的不是本节点或者按Esc 发射一个事件 * @export * @class ClickOutsideDirective * @implements {OnInit} * @implements {OnDestroy} */@Directive({ selector: '[clickOutside]',})export class ClickOutsideDirective implements OnInit, OnDestroy { constructor(private element: ElementRef) { } // Output 装饰器支持一个可选的参数,用来指定组件绑定属性的名称。如果没有指定,则默认使用 @Output 装饰器,装饰的属性名。具体示例如下: @Output('clickOutside') onClickOutside: EventEmitter<void> = new EventEmitter<void>(); escKeyListener = (event: KeyboardEvent) => { // Esc的keyCode为27 if (event.keyCode === 27) { this.onClickOutside.emit(); } } clickListener = (event: Event) => { /** * 兼容IE的写法 * IE下,event对象有srcElement属性,但是没有target属性; * Firefox下,event对象有target属性,但是没有srcElement属性.但他们的作用是相当的 */ if (!isSelfOrAncestorNode(this.element.nativeElement, event.target as Node || event.srcElement)) { this.onClickOutside.emit(); } } ngOnInit(): void { // 初始化监控鼠标弹起和键盘弹起 document.addEventListener('mouseup', this.clickListener); document.addEventListener('keyup', this.escKeyListener); } ngOnDestroy(): void { // 指令销毁时销毁监控 释放内存 document.removeEventListener('mouseup', this.clickListener); document.removeEventListener('keyup', this.escKeyListener); }}// 是否是自己或者父级的DOM节点function isSelfOrAncestorNode(ancestor: Node, node: Node): boolean { while (node) { if (node === ancestor) { return true; } node = node.parentNode; } return false;}
用的时候直接在组件最外层
<div (clickOutside)="关闭函数()">
阅读全文
0 0
- ngx自定义一个判断是否点击本节点的指令
- 判断点击的点是否在范围内
- 判断一个点是否在一个复杂多边形的内部
- 一个判断点是否在三角形内的简单方法
- 判断一个点是否在多边形内部的问题
- 判断一个点是否在给定的凸四边形内
- 判断给定的点是否被一个CGRect包含
- 判断一个时间点是否在一个时间段的方法
- 判断一个点是否在指定的圆内
- android自定义view之 判断一个点是否在制定矩形内
- 点在多边形内算法,C#判断一个点是否在一个复杂多边形的内部
- 点在多边形内算法,JS判断一个点是否在一个复杂多边形的内部
- 19、判断一个单链表是否有环?找到环的入口点。判断两个单链表是否相交,找到相交点。
- 判断点是否在一个三角形内部
- 判断一个点是否在多边形内部
- 判断一个点是否落在多边形内
- 判断一个点是否在多边形内
- 判断一个点是否落在多边形内
- VS2015中使用scanf()不报错的设置方法
- Codeforces 461B 树DP 解题报告
- BZOJ 1618: [Usaco2008 Nov]Buying Hay 购买干草
- FreeMarker(一)字符输出
- PHP对redis操作详解【转】
- ngx自定义一个判断是否点击本节点的指令
- 汇编dos功能调用
- vijos第k优背包
- python 递归深度
- c++慕课网3
- linux 的 inode
- python3.6.3+opencv3.3.0学习笔记五--动态人脸捕获
- PortAudio+webrtc+lame实现采集降噪增益mp3
- UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 0: ordinal not in range(128)错误解