vue修饰符.capture和.self的区别


Posted in Vue.js onApril 22, 2022

.capture和.self区分

capture和self主要是函数执行顺序的问题

.capture先执行父级的函数,再执行子级的触发函数(一般用法),

即是给元素添加一个监听器,当元素发生冒泡时,先触发带有该修饰符的元素。若有多个该修饰符,则由外而内触发。

<div v-on:click.capture='alert("1")' style="width: 100%;height: 45px;background-color: black;">
            <div v-on:click="alert('2')" style='width: 80%;margin-left: 10%;background-color: white;'>
                123
            </div>
        </div>

此时点击子级的div时,会先执行alert(‘1’),再执行alert(‘2’)

self是只执行子级本身的函数

<div v-on:click.self='alert("1")' style="width: 100%;height: 45px;background-color: black;">
            <div v-on:click="alert('2')" style='width: 80%;margin-left: 10%;background-color: white;'>
                123
            </div>
        </div>

此时点击子级的div会执行alert(‘2’),不会执行alert(‘1’)

修饰符capture和self

capture

.capture事件修饰符的作用添加事件侦听器时使用事件捕获模式

即是给元素添加一个监听器,当元素发生冒泡时,先触发带有该修饰符的元素。若有多个该修饰符,则由外而内触发。

就是谁有该事件修饰符,就先触发谁。(捕获阶段触发,从外向内,没有capture修饰符的,从内向外冒泡触发)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>.capture事件修饰符</title>
    <style type="text/css">
        * {
            margin: 0 auto;
            text-align: center;
            line-height: 40px;
        }
        div {
            width: 100px;
        }
        #obj1 {
            background: deeppink;
        }
        #obj2 {
            background: pink;
        }
        #obj3 {
            background: hotpink;
        }
        #obj4 {
            background: #ff4225;
        }
    </style>
    <script src="https://cdn.bootcss.com/vue/2.4.2/vue.min.js"></script>
</head>
<body>
<div id="content">
    <div id="obj1" v-on:click.capture="doc(event)">
        obj1
        <div id="obj2" v-on:click.capture="doc(event)">
            obj2
            <div id="obj3" v-on:click="doc(event)">
                obj3
                <div id="obj4" v-on:click="doc(event)">
                    obj4
                    <!--。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。点击obj4的时候,弹出的顺序为:obj1、obj2、obj4、obj3;
                    由于1,2有修饰符,故而先触发事件,然后就是4本身触发,最后冒泡事件。
                    -->
                </div>
            </div>
        </div>
    </div>
</div>
<script type="text/javascript">
    var content = new Vue({
        el: "#content",
        data: {
            id: ''
        },
        methods: {
            doc(event) {
                this.id = event.currentTarget.id;
                alert(this.id)
            }
        }
    })
</script>
</body>
</html>

self

只当事件是从侦听器绑定的元素本身触发时才触发回调

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>.capture事件修饰符</title>
    <style type="text/css">
        * {
            margin: 0 auto;
            text-align: center;
            line-height: 40px;
        }
        div{
            width:200px;
        }
    </style>
    <script src="https://cdn.bootcss.com/vue/2.4.2/vue.min.js"></script>
</head>
<body>
<div id="app">
   <div class="box1"  style="background: red;" @click.self="test1">
       box1
       <div class="box2" style="background: yellow;">
           box2
<!--box3点击触发test3不会触发test1,如果去除self修饰符就会触发,也就是说加了self元素的事件,只有自身触发才会执行回调,不执行冒泡过来的事件-->
           <div class="box3" style="background: pink;" @click.self="test3">box3</div>
       </div>
   </div>
</div>
<script type="text/javascript">
new Vue({
    el:'#app',
    data:{
    },
    methods:{
      test1(){
          console.log('box1');
      } ,
        test3(){
          console.log('box3');
        }
    }
})
</script>
</body>
</html>

Tags in this post...

Vue.js 相关文章推荐
vue+iview实现文件上传
Nov 17 Vue.js
Vue通过阿里云oss的url连接直接下载文件并修改文件名的方法
Dec 25 Vue.js
Vue中inheritAttrs的使用实例详解
Dec 31 Vue.js
Vue 修改网站图标的方法
Dec 31 Vue.js
如何在Vue项目中添加接口监听遮罩
Jan 25 Vue.js
vue常用高阶函数及综合实例
Feb 25 Vue.js
开发一个封装iframe的vue组件
Mar 29 Vue.js
Vue如何实现组件间通信
May 15 Vue.js
vue+element ui实现锚点定位
Jun 29 Vue.js
解决vue中provide inject的响应式监听
Apr 19 Vue.js
vue router 动态路由清除方式
May 25 Vue.js
vue @ ~ 相对路径 路径别名设置方式
Jun 05 Vue.js
vue 自定义组件添加原生事件
Apr 21 #Vue.js
vue 自定义的组件绑定点击事件
Apr 21 #Vue.js
vue组件vue-esign实现电子签名
Apr 21 #Vue.js
vue动态绑定style样式
Apr 20 #Vue.js
Vue OpenLayer测距功能的实现
vue 给数组添加新对象并赋值
Apr 20 #Vue.js
vue 数字翻牌器动态加载数据
Apr 20 #Vue.js
You might like
php中防止SQL注入的最佳解决方法
2013/04/25 PHP
php 获取文件行数的方法总结
2016/10/11 PHP
PHP基于回溯算法解决n皇后问题的方法示例
2017/11/07 PHP
javascript一些不错的函数脚本代码
2008/09/10 Javascript
js parentElement和offsetParent之间的区别
2010/03/23 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
2013/08/06 Javascript
alert出数组中的随即值代码
2014/09/25 Javascript
php结合imgareaselect实现图片裁剪
2015/07/05 Javascript
web 屏蔽BackSpace键实例代码
2016/12/24 Javascript
jquery插件canvaspercent.js实现百分比圆饼效果
2017/07/18 jQuery
详谈表单重复提交的三种情况及解决方法
2017/08/16 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
bootstrap table实现合并单元格效果
2018/12/24 Javascript
JavaScript页面倒计时功能完整示例
2019/05/15 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
[12:29]2018国际邀请赛 开幕秀
2018/08/22 DOTA
Windows和Linux下Python输出彩色文字的方法教程
2017/05/02 Python
python实现音乐下载的统计
2018/06/20 Python
python 列表,数组和矩阵sum的用法及区别介绍
2018/06/28 Python
NumPy 数组使用大全
2019/04/25 Python
Python生成MD5值的两种方法实例分析
2019/04/26 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
2019/06/18 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
2020/06/01 Python
Selenium webdriver添加cookie实现过程详解
2020/08/12 Python
python raise的基本使用
2020/09/10 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
2020/11/11 Python
css3 transform 3d 使用css3创建动态3d立方体(html5实践)
2013/01/06 HTML / CSS
英国巧克力贸易公司:Chocolate Trading Company
2017/03/21 全球购物
面向对象编程OOP的优点
2013/01/22 面试题
Java面试题汇总
2015/12/06 面试题
一套Delphi的笔试题一
2016/02/14 面试题
《七颗钻石》教学反思
2014/02/28 职场文书
酒店七夕情人节活动策划方案
2014/08/24 职场文书
2015年中职班主任工作总结
2015/05/25 职场文书
亲戚关系证明
2015/06/24 职场文书
初一语文教学反思
2016/03/03 职场文书