vue阻止事件冒泡和捕获方式

 更新时间:2025年06月05日 09:26:40   作者:yujkss  
这篇文章主要介绍了vue阻止事件冒泡和捕获方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
  • @click.stop : 阻止事件冒泡
  • @click.prevent : 阻止事件默认行为
  • @click.self : 事件只作用在元素本身,而不是其子元素

要想了解 VUE 阻止事件冒泡和捕获方法,首先要了解一下 JS 事件和 JS 阻止事件冒泡,捕获方法

1、js 事件的三阶段

捕获阶段

目标阶段:执行当前对象的事件处理程序

冒泡阶段

2、js 阻止事件冒泡,捕获

  • @click.stop : 阻止事件冒泡
  • @click.prevent : 阻止事件默认行为
  • @click.self : 事件只作用在元素本身,而不是其子元素
<a @click.stop="doThis">阻止单击事件继续传播</a>
<form @submit.prevent="onSubmit">提交事件不再重载页面</form>
<a @click.stop.prevent="doThat">修饰符可以串联</a>
<div @click.self="doThat">只当在 event.target 是当前元素自身时触发处理函数.即事件不是从内部元素触发的</div>

补充其他修饰符

  • @click.capture : 使用事件捕获模式
  • @click.once : 事件只触发一次 2.1.4新增
  • @scroll.passive : 告诉浏览器这个事件的默认行为不会被取消 2.3.0新增
  • @keyup.enter : 按键修饰符,enter被按下的时候触发
  • @click.ctrl : 系统修饰符,Ctrl 被按下的时候触发 2.1.0新增
  • @click.ctrl.exact : 有且只有 Ctrl 被按下的时候才触发 2.5.0新增
<div @click.capture="doThis">添加事件监听器时使用事件捕获模式,即元素自身触发的事件先在此处处理,然后才交由内部元素进行处理</div>
<a @click.once="doThis">点击事件将只会触发一次</a>
<div @scroll.passive="onScroll">scroll事件不会取消默认的滚动行为</div>
<input @keyup.13="submit" placeholder="只有在 keyCode 是 13 时调用 vm.submit()">
<button @click.ctrl="onClick">即使 Alt 或 Shift 被一同按下时也会触发</button>
<button @click.ctrl.exact="onCtrlClick">有且只有 Ctrl 被按下的时候才触发</button>
<button @click.exact="onClick">没有任何系统修饰符被按下的时候才触发</button>

使用修饰符时,顺序很重要,相应的代码会以同样的顺序产生。

例如:用 @click.prevent.self 会阻止所有的点击,而@click.self.prevent 只会阻止元素上的点击。

3、JavaScript基础知识:preventDefault和stopPropagation

preventDefault()事件方法

【定义】:如果事件是可取消的,则 preventDefault() 方法会取消该事件,这意味着属于该事件的默认操作将不会发生。

单击“提交”按钮,阻止其提交表

<form action="https://www.baidu.com/"  method="post">
     <input type="submit" value="登录">
</form>

<script>
        console.log(document.forms[0]);
        document.forms[0].onsubmit =  function(){
            console.log(event);
            console.log(event.cancelable);//检测事件是否可以取消--> Boolean
            event.preventDefault();//阻止默认事件  单
            //return false; // 也可以阻止默认事件
           
        }
</script>

单击链接,防止链接跟随 URL

<a href="https://www.baidu.com/" rel="external nofollow"  id="a">点我跳转</a>

<script>
		let a = document.getElementById('a');
        a.onclick = function(){
            console.log(event);
            console.log(event.cancelable);//检测事件是否可以取消 -->Boolean
            event.preventDefault();//阻止默认事件
            //return false; // 也可以阻止默认事件
        }
</script>

非所有活动都可以取消。请使用 cancelable 属性 来确定事件是否可取消。

如上面两个示例中,其返回值为Boolean,可以取消–>true,否则为–>false

【注】preventDefault() 方法不会阻止事件通过 DOM 进一步传播。请使用 stopPropagation() 方法来解决

stopPropagation()事件方法

stopPropagation() 方法防止调用相同事件的传播

【传播阶段】传播意味着向上冒泡到父元素或向下捕获到子元素或元素目标本体 三个3️⃣ 阶段

【注】添加事件(HTML属性事件,JavaScript元素事件,addEventLisenter,attachEvent(IE))默认都是冒泡,捕获需要**addEventLisenter()**显式的指定第三个参数为true(事件捕获)

//样式
<style>
        div {
            padding: 50px;
            background-color: rgba(255, 0, 0, 0.2);
            text-align: center;
            cursor: pointer;
        }
</style>

//HTML
	<p>Click DIV 1:</p>
    <div onclick="func2()">DIV 2
        <div onclick="func1(event)">DIV 1</div>
    </div>
    
//script
<script>
        function func1(event) {
            alert("DIV 1");
            event.stopPropagation();//阻止事件传播
        }

        function func2() {
            alert("DIV 2");
        }
</script>

不阻止事件传播的话,当点击DIV2时,事件会继续向上传播,触发父元素DIV1上的func2(),然后会继续向上传播,直到window对象

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Vue如何循环提取对象数组中的值

    Vue如何循环提取对象数组中的值

    这篇文章主要介绍了Vue如何循环提取对象数组中的值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • vue同一浏览器登录多账号处理方案

    vue同一浏览器登录多账号处理方案

    项目在线上会遇到管理员类似权限比较大的用户,会在同一浏览器登陆多个账号,遇到这样的问题如何处理呢,下面小编给大家介绍vue同一浏览器登录多账号处理方法,感兴趣的朋友一起看看吧
    2024-01-01
  • 如何在Vue.js中实现标签页组件详解

    如何在Vue.js中实现标签页组件详解

    这篇文章主要给大家介绍了关于如何在Vue.js中实现标签页组件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • Vue CLI3 如何支持less的方法示例

    Vue CLI3 如何支持less的方法示例

    这篇文章主要介绍了Vue CLI3 如何支持less的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • vue-week-picker实现支持按周切换的日历

    vue-week-picker实现支持按周切换的日历

    这篇文章主要为大家详细介绍了vue-week-picker实现支持按周切换的日历,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • vue3 element-plus实现图片预览功能实例

    vue3 element-plus实现图片预览功能实例

    这篇文章主要给大家介绍了关于vue3 element-plus实现图片预览功能的相关资料,在项目中我们经常会碰到图片预览的功能需求,文中通过代码示例介绍的非常详细,需要的朋友可以参考下
    2023-09-09
  • Vue中使用mixin扩展组件功能的基本步骤

    Vue中使用mixin扩展组件功能的基本步骤

    Mixin是面向对象程序设计语言中的类,提供了方法的实现,其他类可以访问mixin类的方法而不必成为其子类在Vue中,可以使用mixin来扩展组件的功能,本文给大家介绍了Vue中如何使用mixin扩展组件功能,需要的朋友可以参考下
    2024-11-11
  • vue-cli的工程模板与构建工具详解

    vue-cli的工程模板与构建工具详解

    vue-cli提供的脚手架只是一个最基础的,也可以说是Vue团队认为的工程结构的一种最佳实践。这篇文章主要介绍了vue-cli的工程模板与构建工具 ,需要的朋友可以参考下
    2018-09-09
  • vue.js全局组件和局部组件示例代码

    vue.js全局组件和局部组件示例代码

    组件是Vue.js的最核心的功能,所谓的组件化就是把页面拆分成多个组件,每个组件单独使用CSS,JS,模板,图片等资源进行开发与维护,然后在制作网页的时候根据需要调用相关的组件,这篇文章主要给大家介绍了关于vue.js全局组件和局部组件的相关资料,需要的朋友可以参考下
    2022-12-12
  • vue axios调用接口方法报错500 internal server error的两种解决方法

    vue axios调用接口方法报错500 internal server err

    前端使用axios 访问后端接口时报错,在浏览器中点击红色的报错数据,本文给大家分享vue axios调用接口方法报错500 internal server error的两种解决方法,感兴趣的朋友一起看看吧
    2023-10-10

最新评论