Angular: DOCUMENT

不用原生的 document,是因为不利于后端渲染,所以避免使用原生浏览器的对象

typescript 复制代码
import { DOCUMENT } from '@angular/common';
import { Directive, Inject, Input, OnChanges, Output, Renderer2, SimpleChanges } from '@angular/core';

@Directive({
  selector: '[appClickoutside]'
})
export class ClickoutsideDirective implements OnChanges{
  @Input() bindFlag = false;  // 是否监听 document
  private handleClick: ()=> void;
  
  constructor(
    @Inject(DOCUMENT) private doc: Document,
    private rd: Renderer2
    ) {
      
    }

  ngOnChanges(changes: SimpleChanges): void {
    if (changes['bindFlag'] && !changes['bindFlag'].firstChange) {
      if (this.bindFlag) {
        this.handleClick = this.rd.listen(this.doc, 'click', evt=> {
          // 点击事件的操作
        })
      }else {
        this.handleClick(); // 解绑
      }
    }
  }
  getDocument() {
    // 获取 document 的属性
    this.doc.documentElement.clientWidth;
    this.doc.body.offsetWidth;
    this.doc.documentElement.clientHeight;
    this.doc.body.offsetHeight;
    ...
    // 设置 document 的属性
    this.doc.documentElement.scrollTop = 0;
    ...
  }
}
相关推荐
gnip7 小时前
Jst执行上下文栈和变量对象
前端·javascript
excel7 小时前
🐣 最简单的卷积与激活函数指南(带示例)
前端
醉方休8 小时前
npm/pnpm软链接的优点和使用场景
前端·npm·node.js
拉不动的猪8 小时前
简单回顾下Weakmap在vue中为何不能去作为循环数据源,以及替代方案
前端·javascript·vue.js
How_doyou_do8 小时前
数据传输优化-异步不阻塞处理增强首屏体验
开发语言·前端·javascript
奇舞精选8 小时前
超越Siri的耳朵:ASR与Whisper零代码部署实战指南
前端·人工智能·aigc
奇舞精选8 小时前
Nano Banana 如何为前端注入 AI 控制力
前端·aigc
一支鱼8 小时前
基于 Node.js 的短视频制作神器 ——FFCreator
前端·node.js·音视频开发
DT——8 小时前
前端登录鉴权详解
前端·javascript
李姆斯8 小时前
复盘上瘾症:到底什么时候该“复盘”,什么时候不需要“复盘”
前端·后端·团队管理