重新认识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 相关文章推荐
js判断IE浏览器版本过低示例代码
Nov 22 Javascript
js购物车实现思路及代码(个人感觉不错)
Dec 23 Javascript
jQuery页面加载初始化常用的三种方法
Jun 04 Javascript
JavaScript中字符串(string)转json的2种方法
Jun 25 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
Jan 12 Javascript
JavaScript 基础函数_深入剖析变量和作用域
May 18 Javascript
prototype与__proto__区别详细介绍
Jan 09 Javascript
ReactNative列表ListView的用法
Aug 02 Javascript
详解es6新增数组方法简便了哪些操作
May 09 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
Mar 02 Javascript
一文读懂vue动态属性数据绑定(v-bind指令)
Jul 20 Javascript
vue-cil之axios的二次封装与proxy反向代理使用说明
Apr 07 Vue.js
深入浅出理解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
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
2018/06/04 PHP
PHP CURL中传递cookie的方法步骤
2019/05/09 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
一个不错的应用,用于提交获取文章内容,不推荐用
2007/03/03 Javascript
Mootools 1.2教程 正则表达式
2009/09/15 Javascript
查看图片(前进后退)功能实现js代码
2013/04/24 Javascript
jQuery照片伸缩效果不影响其他元素的布局
2014/05/09 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
jQuery树形下拉菜单特效代码分享
2015/08/15 Javascript
javascript简单进制转换实现方法
2016/11/24 Javascript
关于javascript事件响应的基础语法总结(必看篇)
2016/12/26 Javascript
node.js学习之事件模块Events的使用示例
2017/09/28 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
简单易扩展可控性强的Jquery转盘抽奖程序
2019/03/16 jQuery
element-ui组件中input等的change事件中传递自定义参数
2019/05/22 Javascript
python抓取网页图片示例(python爬虫)
2014/04/27 Python
Python实现的简单发送邮件脚本分享
2014/11/07 Python
python实现简单爬虫功能的示例
2016/10/24 Python
python中的变量如何开辟内存
2018/06/26 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
Django之富文本(获取内容,设置内容方式)
2020/05/21 Python
flask开启多线程的具体方法
2020/08/02 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
python中常用的数据结构介绍
2021/01/12 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
2021/01/29 Python
CSS3支持IE6, 7, and 8的边框border属性
2012/12/28 HTML / CSS
html5调用摄像头功能的实现代码
2018/05/07 HTML / CSS
世界上最好的帽子:Tilley
2016/11/27 全球购物
美国保健品专家:Life Extension
2018/05/04 全球购物
三星法国官方网站:Samsung法国
2019/10/31 全球购物
师德师风承诺书
2014/05/23 职场文书
公务员群众路线专题民主生活会发言材料
2014/09/17 职场文书
python 命令行传参方法总结
2021/05/25 Python
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
2022/04/04 Python