Vue指令实现OutClick的示例


Posted in Javascript onNovember 16, 2020

原始实现

下面是两种常见的模态框的实现方式

方案一:默认 click 都是放在冒泡阶段,只要在内容区域上添加 click 的阻止冒泡即可

<div class="cover" @click="close">
 <!-- 阻止冒泡 -->
 <div class="content" @click.stop>modal content</div>
</div>

方案二:通过代码判断点击触发的 DOM 是否在内容区域内

<div class="cover" @click="handleClick">
 <div class="content" ref="content">modal content</div>
</div>
handleClick (e) {
 let clickOut = true
 let temp = e.target
 do {
  if (temp === this.$refs.content) {
   clickOut = false
   break
  }
  temp = temp.parentElement
 } while (temp !== document.documentElement)
 console.log(clickOut)
}

指令实现

上面的代码可以解决全屏的模态框点击外部区域关闭。但是还有一种 Pop 的弹出,这种弹出的外部区域不在本组件内,想要实现这种弹出的点击外部区域关闭用上面的方式二也是可以的,只需把 mounted 阶段把 handleClick 事件添加到 body,在 beforeDestroy 上解绑 body 上的点击时间就就可以了。

如果多个组件需要实现这点击外部区域关闭的效果,可以通过 Vue 的指令来进行封装

实现弹窗

<div class="cover">
 <div class="content" v-out-click="close">modal content</div>
</div>

实现弹出

<button @click="popIsShow = true">显示气泡</button>
<div class="pop" v-if="popIsShow" v-out-click="closePop">I'm pop text</div>

指令代码的具体内容如下。有一点比较难受的是指令里面没有地方能存放变量,只好把把这些变量放到了 DOM 上了。还有就是在使用的时候要加上v-的前缀,指令的名字不用带上v-

import outClick from './directive/out-click.js'
Vue.directive(outClick.name, outClick)
const KEY_OUT = '_out_click'
const KEY_OUT_EVENT = '_out_click_event'
const KEY_IN = '_in_click'
const KEY_FLAG = '_in_out_flag'

function removeEvent(el, binding, vnode) {
 el.removeEventListener('click', el[KEY_IN], false)
 window.removeEventListener('click', el[KEY_OUT], false)
 delete el[KEY_IN]
 delete el[KEY_OUT]
 delete el[KEY_OUT_EVENT]
 delete el[KEY_FLAG]
}

function initEvent(el, binding, vnode) {
 // setTimeout 0: 忽略点击外部的按钮初始化该组件时,触发的origin click
 setTimeout(() => {
  el[KEY_OUT] = () => outClick(el)
  el[KEY_IN] = () => inClick(el)
  el[KEY_OUT_EVENT] = binding.value
  el.addEventListener('click', el[KEY_IN], false)
  window.addEventListener('click', el[KEY_OUT], false)
 }, 0)
}

function inClick(el) {
 // 通过事件捕获的顺序作为标志位
 // 最好不要使用阻止冒泡来实现,那样会影响其他的click无法触发
 el[KEY_FLAG] = '1'
}

function outClick(el) {
 if (!el[KEY_FLAG] && el[KEY_OUT_EVENT]) {
  el[KEY_OUT_EVENT]()
 }
 delete el[KEY_FLAG]
}

export default {
 name: 'out-click',
 update: (el, binding, vnode) => {
  if (binding.value === binding.oldValue) {
   return
  }
  removeEvent(el, binding, vnode)
  initEvent(el, binding, vnode)
 },
 bind: initEvent,
 unbind: removeEvent
}

以上就是Vue指令实现OutClick的示例的详细内容,更多关于Vue指令实现OutClick的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
javascript下判断一个元素是否存在的代码
Mar 05 Javascript
非主流的textarea自增长实现js代码
Dec 20 Javascript
JS 有趣的eval优化输入验证实例代码
Sep 22 Javascript
教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
Jul 23 Javascript
jQuery中extend()和fn.extend()方法详解
Jun 03 Javascript
jQuery实现宽屏图片轮播实例教程
Nov 24 Javascript
超链接怎么正确调用javascript函数
May 23 Javascript
js 颜色选择插件
Jan 23 Javascript
Angular实现的内置过滤器orderBy排序与模糊查询功能示例
Dec 29 Javascript
JavaScript面向对象继承原理与实现方法分析
Aug 09 Javascript
javascript实现留言板功能
Feb 08 Javascript
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
Nov 20 Vue.js
浅谈vue在html中出现{{}}的原因及解决方式
Nov 16 #Javascript
vue组件中传值EventBus的使用及注意事项说明
Nov 16 #Javascript
小程序自定义弹框效果
Nov 16 #Javascript
vuex中遇到的坑,vuex数据改变,组件中页面不渲染操作
Nov 16 #Javascript
基于Vue+Webpack拆分路由文件实现管理
Nov 16 #Javascript
小程序实现上下切换位置
Nov 16 #Javascript
小程序实现点击tab切换左右滑动
Nov 16 #Javascript
You might like
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
php实现的一个简单json rpc框架实例
2015/03/30 PHP
PHP实现普通hash分布式算法简单示例
2018/08/06 PHP
Javascript倒计时代码
2010/08/12 Javascript
为EasyUI的Tab标签添加右键菜单的方法
2012/07/14 Javascript
NodeJS的url截取模块url-extract的使用实例
2013/11/18 NodeJs
jQuery处理json数据返回数组和输出的方法
2015/03/11 Javascript
JavaScript实现的链表数据结构实例
2015/04/02 Javascript
Angular.JS学习之依赖注入$injector详析
2016/10/20 Javascript
form表单序列化详解(推荐)
2017/08/15 Javascript
微信小程序如何获取手机验证码
2018/11/04 Javascript
使用jQuery实现掷骰子游戏
2019/10/24 jQuery
基于JS判断对象是否是数组
2020/01/10 Javascript
如何基于jQuery实现五角星评分
2020/09/02 jQuery
[02:15]2015国际邀请赛选手档案IG.Ferrari 430
2015/07/30 DOTA
python批量修改文件后缀示例代码分享
2013/12/24 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
python画图——实现在图上标注上具体数值的方法
2019/07/08 Python
Python分析彩票记录并预测中奖号码过程详解
2019/07/09 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
tensorflow指定CPU与GPU运算的方法实现
2020/04/21 Python
Python如何自动获取目标网站最新通知
2020/06/18 Python
Python使用OpenPyXL处理Excel表格
2020/07/02 Python
HTML5 直播疯狂点赞动画实现代码 附源码
2020/04/14 HTML / CSS
中国综合性网上购物商城:当当(网上卖书起家)
2016/11/16 全球购物
6号汽车旅馆预订:Motel 6
2018/02/11 全球购物
新东网科技Java笔试题
2012/07/13 面试题
最新远光软件笔试题面试题内容
2013/11/08 面试题
机械专业个人求职自荐信格式
2013/09/21 职场文书
金融专业推荐信
2013/11/14 职场文书
十八届三中全会宣传方案
2014/02/21 职场文书
美术学专业求职信
2014/07/23 职场文书
大学生先进个人主要事迹材料
2015/11/04 职场文书
Python基于Tkinter开发一个爬取B站直播弹幕的工具
2021/05/06 Python
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript
JavaScript的Set数据结构详解
2022/02/18 Javascript