重新认识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 相关文章推荐
Blocksit插件实现瀑布流数据无限( 异步)加载
Jun 20 Javascript
node.js中的fs.symlinkSync方法使用说明
Dec 15 Javascript
js用拖动滑块来控制图片大小的方法
Feb 27 Javascript
浅谈node.js中async异步编程
Oct 22 Javascript
在其他地方你学不到的jQuery小贴士和技巧(欢迎收藏)
Jan 20 Javascript
jQuery实现调整表格单列顺序完整实例
Jun 20 Javascript
JavaScript中setter和getter方法介绍
Jul 11 Javascript
获取JS中网页各种高宽与位置的方法总结
Jul 27 Javascript
js+html5 canvas实现ps钢笔抠图
Apr 28 Javascript
elementUI 动态生成几行几列的方法示例
Jul 11 Javascript
原生js实现瀑布流效果
Mar 09 Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
Nov 11 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快速url重写 更新版[需php 5.30以上]
2010/04/20 PHP
PHP实现将标点符号正则替换为空格的方法
2017/08/09 PHP
js form 验证函数 当前比较流行的错误提示
2009/06/23 Javascript
JQuery入门——事件切换之hover()方法应用介绍
2013/02/05 Javascript
同域jQuery(跨)iframe操作DOM(示例代码)
2013/12/13 Javascript
js选择并转移导航菜单示例代码
2014/08/19 Javascript
javascript里使用php代码实例
2014/12/13 Javascript
javascript日期格式化方法小结
2015/12/17 Javascript
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
element vue validate验证名称重复 输入框与后台重复验证 特殊字符 字符长度 及注意事项小结【实例代码】
2018/11/20 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
JS函数动态传递参数的方法分析【基于arguments对象】
2019/06/05 Javascript
vue.js 2.0实现简单分页效果
2019/07/29 Javascript
javascript设计模式 ? 原型模式原理与应用实例分析
2020/04/10 Javascript
vue实现购物车加减
2020/05/30 Javascript
JavaScript Window浏览器对象模型原理解析
2020/05/30 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
PHP读取远程txt文档到数组并实现遍历
2020/08/25 Javascript
使用Python3中的gettext模块翻译Python源码以支持多语言
2015/03/31 Python
解决python3在anaconda下安装caffe失败的问题
2017/06/15 Python
Python对列表去重的多种方法(四种方法)
2017/12/05 Python
使用pandas批量处理矢量化字符串的实例讲解
2018/07/10 Python
详解pandas中MultiIndex和对象实际索引不一致问题
2019/07/23 Python
Pycharm导入anaconda环境的教程图解
2020/07/31 Python
python 三种方法提取pdf中的图片
2021/02/07 Python
image-set实现Retina屏幕下图片显示详细介绍
2012/12/24 HTML / CSS
CSS3下的渐变文字效果实现示例
2018/03/02 HTML / CSS
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
财务会计专业推荐信
2013/11/30 职场文书
初中化学教学反思
2014/01/23 职场文书
北京奥运会主题口号
2014/06/13 职场文书
考试作弊万能检讨书
2014/10/19 职场文书
交通安全学习心得体会
2016/01/18 职场文书
python调用ffmpeg命令行工具便捷操作视频示例实现过程
2021/11/01 Python