重新认识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 相关文章推荐
超酷的网页音乐播放器DewPlayer使用方法
Dec 18 Javascript
动态读取JSON解析键值对的方法
Jun 03 Javascript
javascript+canvas制作九宫格小程序
Dec 28 Javascript
JavaScript中匿名函数的用法及优缺点详解
Jun 01 Javascript
jquery代码规范让代码越来越好看
Feb 03 Javascript
微信小程序 template模板详解及实例代码
Mar 09 Javascript
Bootstrap警告(Alerts)的实现方法
Mar 22 Javascript
微信扫码支付零云插件版实例详解
Apr 26 Javascript
vue 点击展开显示更多(点击收起部分隐藏)
Apr 09 Javascript
js图片查看器插件用法示例
Jun 22 Javascript
vue实现一个获取按键展示快捷键效果的Input组件
Jan 13 Vue.js
vue2实现provide inject传递响应式
May 21 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
php入门学习知识点五 关于php数组的几个基本操作
2011/07/14 PHP
php中的异常和错误浅析
2017/05/03 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
Web层改进II-用xmlhttp 无声息提交复杂表单
2007/01/22 Javascript
innerText和innerHTML 一些问题分析
2009/05/18 Javascript
js中for in的用法示例解析
2013/12/25 Javascript
jQuery 如何先创建、再修改、后添加DOM元素
2014/05/20 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(基于jquery)
2015/11/18 Javascript
JS组件中bootstrap multiselect两大组件较量
2016/01/26 Javascript
javascript实现不同颜色Tab标签切换效果
2016/04/27 Javascript
JavaScript学习笔记整理_setTimeout的应用
2016/09/19 Javascript
js多个物体运动功能实例分析
2016/12/20 Javascript
简单的Vue异步组件实例Demo
2017/12/27 Javascript
基于rollup的组件库打包体积优化小结
2018/06/18 Javascript
如何在js代码中消灭for循环实例详解
2018/07/29 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
2018/08/24 Javascript
layui实现下拉框三级联动
2019/07/26 Javascript
详细解读Python中解析XML数据的方法
2015/10/15 Python
Python3使用requests发闪存的方法
2016/05/11 Python
Python2和Python3的共存和切换使用
2019/04/12 Python
Python使用QQ邮箱发送邮件实例与QQ邮箱设置详解
2020/02/18 Python
使用HTML5 Canvas为图片填充颜色和纹理的教程
2016/03/21 HTML / CSS
计算机网络专业推荐信
2013/11/24 职场文书
医校毕业生自我鉴定
2014/01/25 职场文书
求职信的七个关键技巧
2014/02/05 职场文书
幼儿教师演讲稿
2014/05/06 职场文书
讲党性心得体会
2014/09/03 职场文书
2014教师个人自我评价范文
2014/09/13 职场文书
对党的十八届四中全会的期盼
2014/10/17 职场文书
党的群众路线教育实践活动个人整改措施
2014/10/27 职场文书
团组织推荐意见
2015/06/05 职场文书
我的兄弟姐妹观后感
2015/06/15 职场文书
2016年小学中秋节活动总结
2016/04/05 职场文书
年终奖金发放管理制度,中小企业适用,拿去救急吧!
2019/07/12 职场文书
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers
InterProcessMutex实现zookeeper分布式锁原理
2022/03/21 Java/Android