重新认识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实现DIV的一些简单控制
Jun 04 Javascript
JavaScript与Image加载事件(onload)、加载状态(complete)
Feb 14 Javascript
js中取得变量绝对值的方法
Jan 03 Javascript
jquery分割字符串的方法
Jun 24 Javascript
jquery实现简单的轮换出现效果实例
Jul 23 Javascript
javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
Jul 27 Javascript
vue如何引用其他组件(css和js)
Apr 13 Javascript
使用D3.js构建实时图形的示例代码
Aug 28 Javascript
web页面和微信小程序页面实现瀑布流效果
Sep 26 Javascript
微信公众平台 发送模板消息(Java接口开发)
Apr 17 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
Sep 17 Javascript
如何使JavaScript休眠或等待
Apr 27 Javascript
深入浅出理解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
php生成随机数或者字符串的代码
2008/09/05 PHP
PHP重定向的3种方式
2013/03/07 PHP
CodeIgniter基本配置详细介绍
2013/11/12 PHP
wamp安装后自定义配置的方法
2014/08/23 PHP
PHP中__autoload和Smarty冲突的简单解决方法
2016/04/08 PHP
thinkPHP的表达式查询用法详解
2016/09/14 PHP
php获取数据库中数据的实现方法
2017/06/01 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
PHP封装的完整分页类示例
2018/08/21 PHP
QQ邮箱的一个文本编辑器代码
2007/03/14 Javascript
一些常用的JS功能函数代码
2009/06/23 Javascript
如何在一个页面显示多个百度地图
2013/04/07 Javascript
jQuery实现可拖动的浮动层完整代码
2013/05/27 Javascript
JS Replace()的高级使用方法介绍
2013/06/29 Javascript
php+js实现倒计时功能
2014/06/02 Javascript
JS实现向表格中动态添加行的方法
2015/03/30 Javascript
jQuery插件扩展操作入门示例
2017/01/16 Javascript
在react项目中使用antd的form组件,动态设置input框的值
2020/10/24 Javascript
Python中的对象,方法,类,实例,函数用法分析
2015/01/15 Python
用Python展示动态规则法用以解决重叠子问题的示例
2015/04/02 Python
python脚本内运行linux命令的方法
2015/07/02 Python
python线程中的同步问题及解决方法
2019/08/29 Python
Python图像处理库PIL的ImageFont模块使用介绍
2020/02/26 Python
python如何变换环境
2020/07/21 Python
Python语言编写智力问答小游戏功能
2020/10/13 Python
项目建议书范文
2014/05/12 职场文书
法学自荐信
2014/06/20 职场文书
高中校园广播稿
2014/10/21 职场文书
新生入学欢迎词
2015/01/26 职场文书
质检员工作总结2015
2015/04/25 职场文书
小学大队长竞选稿
2015/11/20 职场文书
初中班级口号霸气押韵
2015/12/24 职场文书
公司周年庆寄语
2019/06/21 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书
css3实现的加载动画效果
2021/04/07 HTML / CSS
Python利用zhdate模块实现农历日期处理
2022/03/31 Python