【日常记录】【JS】优雅检测用户是否在指定元素的外部点击

1、界面基本布局

在这里插入图片描述

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;

    }

    body {
      height: 100vh;
      width: 100vw;
    }

    .box {
      width: 80vw;
      height: 80vh;
      background-color: aquamarine;
    }

    .box2 {
      width: 50vw;
      height: 50vh;
      background-color: rgb(247, 7, 95);
    }

    .box3 {
      width: 30vw;
      height: 30vh;
      background-color: rgb(119, 235, 4);
    }
  </style>
</head>

<body>
  <div class="box">
    第一层DIV

    <div class="box2">
      第二层DIV


      <div class="box3">
        第三层DIV

        <p style="height: 100px;background-color: blueviolet;">第四层 P</p>
      </div>
    </div>
  </div>

</body>

</html>

2、代码实现

Node.contains()

  • 此方法返回一个布尔值,表示一个节点是否是给定节点的后代,即该节点本身、其直接子节点(childNodes)、子节点的直接子节点等。
  <script>
    // 判断用户是不是点击,第三层 DIV 以外的区域
    let box3El = document.querySelector('.box3')
    document.addEventListener('click', (e) => {
      let curEl = e.target
      if (box3El.contains(curEl)) {
        console.log('点击元素在  第三层DOM 里面');
      } else {
        console.log('点击元素 不在    第三层DOM 里面');
      }
      console.log('当前实际点击的DOM', e.target);



    })
  </script>

在这里插入图片描述

当鼠标点击这个红框的时候,e.target 指向的是 box2,从上面的DOM结构上可以看出,box2 不在 box3 里面,所以返回 false

在这里插入图片描述

实际触发的是 box3 ,代码写的是 box3El.contains(curEl), 因为这个方法本身就是,如若 这个方法你传入的和 box3El 相等,那他还是返回 true

在这里插入图片描述

这个时候实际触发的是 p 标签,因为在DOM层级上 p标签 属于 box3 所以这个时候也是返回的 true

3、参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值