当前位置: 首页 > news >正文

点击元素以外的事件监听

在项目中,我们经常会遇到需要监听目标元素以外的区域被点击或鼠标移入移出等需求。

例如下面我们有一个表格里面嵌套表单的组件
默认展示

我希望点击n行的时候,n行的元素变成表单元素进行输入或者选择,
点击该行

当我点击其他其他区域n行又会恢复成数据展示的样子。
默认展示
那现在我们来想想这种监听应该如何实现呢?

contains

如果你听说过 contains这个方法,那么你会豁然开朗。这个方法的作用是用来判断一个元素是否包含另一个元素。那么如果我们通过事件对象拿到当前事件的目标元素,再通过 contains去判断这个目标元素有没有在我们需要监听的元素内部,就可以轻易实现我们的需求了。

上代码

<!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>body {margin: 0;padding: 0;background-color: aqua;width: 100vw;height: 100vh;}.parent {width: 100px;height: 100px;background-color: yellow;}.son {position: relative;left: 30px;top: 30px;width: 30px;height: 30px;background-color: red;}</style>
</head><body><div class="parent"><div class="son"></div></div><script>const parentEle = document.querySelector('.parent')document.body.addEventListener('click', e => {const target = e.targetif (parentEle.contains(target)) {alert('点击了元素包含区域')} else {alert('点击了元素以外区域')}})</script>
</body></html>

也附上一个可以直接预览效果的地址

当然,我们可以做到更加便捷。如果是在vue项目里我们可以创建一个自定义指令的方式便捷实现监听效果。

export default function install(Vue) {Vue.directive('clickoutside', {bind(el, { value: fun, arg }) {console.log(arg)arg = arg || 'click'document.addEventListener(arg, handleFun.bind(null, el, fun))},unbind(el, { arg }) {document.removeEventListener(arg, handleFun)},})
}function handleFun(el, fun, e) {let flag = el.contains(e.target)if (!flag) {fun()}
}
<button v-clickoutside="fn">按钮</button>

上面是一个极其简单的自定义指令,默认监听点击事件,它可以用来监测点击的元素是否在我们所监测的元素内。不在则执行指令绑定的方法。

最后再补充一个,如果你使用了element-ui,那么他的内部其实是自带了这样一个方法的。
你可以像这样进行引用

import clickoutside from 'element-ui/src/utils/clickoutside'
http://www.lryc.cn/news/252117.html

相关文章:

  • 猫头虎分享ubuntu20.04下VSCode无法输入中文解决方法
  • tcpdump使用心得
  • QJsonObject 是 Qt 框架中用于表示 JSON 对象的类
  • kafka3.6.0部署
  • MybatisPlus批量插入(伪批量),增强为真实批量插入
  • 【零基础入门Python】Python If Else流程控制
  • 新手零基础学习彩铅画,彩铅快速入门教程合集
  • 线程池的拒绝策略
  • Redis7--基础篇5(管道、发布订阅)
  • Unity中Shader指令优化(编译后指令解析)
  • 单个 Zip 文件体积超过 40GB
  • pandas 基础操作3
  • 开发知识点-Maven包管理工具
  • 104. 二叉树的最大深度
  • JAVA毕业设计113—基于Java+Springboot+Vue的体育馆预约系统(源代码+数据库+12000字论文)
  • 【自动化测试】pytest 用例执行中print日志实时输出
  • 【深度学习】KMeans中自动K值的确认方法
  • github问题解决(持续更新中)
  • 如何创建一个vue工程
  • 50 代码审计-PHP无框架项目SQL注入挖掘技巧
  • 基于Spring、SpringMVC、MyBatis的企业博客网站
  • spring日志输出到elasticsearch
  • 谷歌 Gemini 模型发布计划推迟:无法可靠处理部分非英语沟通
  • Ubuntu显卡及内核更新问题
  • SpringBoot错误处理机制解析
  • 牛客剑指offer刷题模拟篇
  • Locust单机多核压测,以及主从节点的数据通信处理!
  • ERROR: [pool www] please specify user and group other than root
  • 京东商品详情接口在电商行业中的重要性及实时数据获取实现
  • WT2003H MP3语音芯片方案:强大、灵活且易于集成的音频解决方案