重新认识vue之事件阻止冒泡的实现


Posted in Javascript onAugust 02, 2018

冒泡的表现

近期用vue做了一个需求,大概是同一个区域,点击不同位置有不同的响应函数,还有个总的响应函数,好吧,如下图所示:

重新认识vue之事件阻止冒泡的实现

他们的DOM结构如下:

<div v-for="(item, index) in listData" @click="handleClick3">
  <el-col :span="grid">
    <div @click="handleClick1"></div>
  </el-col>
  <el-col @click="handleClick2">
  </el-col>
</div>

冒泡在这里的表现就是当用户点击图中事件1或事件2区域时,事件3也会执行。这是因为时间冒泡机制,导致点击'handleClick1'时'handleClick3' 也会响应。在大部分的时候这都是不希望的, 同样我这里也不希望。

看下冒泡的经典描述吧还是

重新认识vue之事件阻止冒泡的实现

图中4,5,6,7步骤就是冒泡阶段。

通用解决办法

事件冒泡了嘛,那就阻止事件冒泡呗。 鉴于不同浏览器阻止事件冒泡方法不一样,建议手写一个事件阻止冒泡方法.

function stopPropagation(event){
  var e=arguments.callee.caller.arguments[0] || event;//这里是因为除了IE有event其他浏览器没有所以要做兼容
  if(window.event){    //这是IE浏览器
    e.cancelBubble=true;
  }else if(e && e.stopPropagation){   //这是其他浏览器
    e.stopPropagation();//阻止冒泡事件
  }
}

<button onclick="stopPropagation(event)"> 按钮 </button>  // 使用

vue中解决办法

上述兼容方法,针对 event 和 停止冒泡方法均做了兼容。 但是在vue中需要在内联语句处理器中访问原始的 DOM 事件。可以用特殊变量 $event 把它传入方法。如:

<button v-on:click="warn('Form cannot be submitted yet.', $event)">
 Submit
</button>

// ...
methods: {
 warn: function (message, event) {
  // 现在我们可以访问原生事件对象
  if (event) event.preventDefault()
  alert(message)
 }
}

因此这里我们可以简化一下上述停止冒泡方法:

function stopPropagation(event) {
  if(event) {
    event.stopPropagation ? event.stopPropagation(): event.cancelBubble = true;
  }
}

evnet 为 $event

vue中处理冒泡标准姿势

事件修饰符

Vue.js 为 v-on 提供了事件修饰符,修饰符是由点开头的指令后缀来表示的。这些事件修饰符主要有以下几个:

  1. stop
  2. prevent
  3. capture
  4. prevent
  5. self
  6. once
  7. passive

看到没有,第一个'stop'就是我们想要的!

这些修饰符正是为了解决这些问题而生的。也就说我们只需要在模板中这样写就搞定停止冒泡了。

<div v-for="(item, index) in listData" @click="handleClick3">
  <el-col :span="grid">
    <div @click.stop="handleClick1"></div>
  </el-col>
  <el-col @click.stop="handleClick2">
  </el-col>
</div>

很完美有没有,这就不用在事件响应逻辑中去处理dom事件细节了。

除 冒泡之外,vue提供的修饰符还有这些功能。

<!-- 阻止单击事件继续传播 -->
<a v-on:click.stop="doThis"></a>

<!-- 提交事件不再重载页面 -->
<form v-on:submit.prevent="onSubmit"></form>

<!-- 修饰符可以串联 -->
<a v-on:click.stop.prevent="doThat"></a>

<!-- 只有修饰符 -->
<form v-on:submit.prevent></form>

<!-- 添加事件监听器时使用事件捕获模式 -->
<!-- 即元素自身触发的事件先在此处处理,然后才交由内部元素进行处理 -->
<div v-on:click.capture="doThis">...</div>

<!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
<!-- 即事件不是从内部元素触发的 -->
<div v-on:click.self="doThat">...</div>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 全角转半角部分
Oct 28 Javascript
javascript相等运算符与等同运算符详细介绍
Nov 09 Javascript
Extjs grid panel自带滚动条失效的解决方法
Sep 11 Javascript
javascript实现控制div颜色
Jul 07 Javascript
jQuery插件简单实现方法
Jul 18 Javascript
自动完成的搜索框javascript实现
Feb 26 Javascript
ES6新特性之Object的变化分析
Mar 31 Javascript
小程序实现左滑删除功能
Oct 30 Javascript
Vue框架下引入ActiveX控件的问题解决
Mar 25 Javascript
详解Vue 全局变量,局部变量
Apr 17 Javascript
Vee-validate 父组件获取子组件表单校验结果的实例代码
May 20 Javascript
jQuery实现飞机大战小游戏
Jul 05 jQuery
深入浅出理解JavaScript高级定时器原理与用法
Aug 02 #Javascript
解决vue router组件状态刷新消失的问题
Aug 01 #Javascript
Promise.all中对于reject的处理方法
Aug 01 #Javascript
详解es6超好用的语法糖Decorator
Aug 01 #Javascript
Vue Router去掉url中默认的锚点#
Aug 01 #Javascript
vue定义全局变量和全局方法的方法示例
Aug 01 #Javascript
node.js遍历目录的方法示例
Aug 01 #Javascript
You might like
js下函数般调用正则的方法附代码
2008/06/22 PHP
destoon实现公司新闻详细页添加评论功能的方法
2014/07/15 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
2014/11/18 PHP
php接口数据加密、解密、验证签名
2015/03/12 PHP
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
2009/10/29 Javascript
jquery下利用jsonp跨域访问实现方法
2010/07/29 Javascript
ASP.NET jQuery 实例15 通过控件CustomValidator验证CheckBoxList
2012/02/03 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
js根据日期判断星座的示例代码
2014/01/23 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
JS获取及验证开始结束日期的方法
2016/08/20 Javascript
js监听键盘事件的方法_原生和jquery的区别详解
2016/10/10 Javascript
为输入框加入数字js校验代码分享
2017/11/02 Javascript
React学习笔记之高阶组件应用
2018/06/02 Javascript
vue通过指令(directives)实现点击空白处收起下拉框
2018/12/06 Javascript
jQuery AJAX与jQuery事件的分析讲解
2019/02/18 jQuery
layui 对弹窗 form表单赋值的实现方法
2019/09/04 Javascript
vue中进行微博分享的实例讲解
2019/10/14 Javascript
[55:25]2018DOTA2亚洲邀请赛3月29日 小组赛A组 VG VS OG
2018/03/30 DOTA
Python 由字符串函数名得到对应的函数(实例讲解)
2017/08/10 Python
Python中turtle作图示例
2017/11/15 Python
Python进阶之尾递归的用法实例
2018/01/31 Python
Python 最大概率法进行汉语切分的方法
2018/12/14 Python
利用python爬取有道词典的方法
2020/12/08 Python
css3 边框、背景、文本效果的实现代码
2018/03/21 HTML / CSS
aden + anais英国官网:美国婴儿贴身用品品牌
2019/09/08 全球购物
广州迈达威.net面试题目
2012/03/10 面试题
STP的判定过程
2012/10/01 面试题
如何用Java判断一个文件或目录是否存在
2012/11/19 面试题
土木工程实习生自我鉴定
2013/09/19 职场文书
行政工作个人的自我评价
2014/02/13 职场文书
公证委托书大全
2014/04/04 职场文书
小学校长竞聘演讲稿
2014/05/16 职场文书
创文明城市标语
2014/06/16 职场文书
活动总结报告怎么写
2014/07/03 职场文书
Java存储没有重复元素的数组
2022/04/29 Java/Android