一、什么是event对象

event对象:代表的是事件的状态。比如获取当前的元素:e.Target。

二、事件冒泡

什么是事件冒泡呢?百度百科的解释如下:

当事件发生后,这个事件就要开始传播(从里到外或者从外向里)。为什么要传播呢?因为事件源本身(可能)并没有处理事件的能力,即处理事件的函数(方法)并未绑定在该事件源上。例如我们点击一个按钮时,就会产生一个click事件,但这个按钮本身可能不能处理这个事件,事件必须从这个按钮传播出去,从而到达能够处理这个事件的代码中(例如我们给按钮的onclick属性赋一个函数的名字,就是让这个函数去处理该按钮的click事件),或者按钮的父级绑定有事件函数,当该点击事件发生在按钮上,按钮本身并无处理事件函数,则传播到父级去处理。

可能下面的例子会更容易理解一些:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>事件冒泡</title>
<!--引入vue.js-->
<script src="node_modules/vue/dist/vue.js" ></script>
<script>
window.onload=function(){
// 构建vue实例
new Vue({
el:"#my",
data:{
},
// 方法
methods:{
play1:function(){
console.log("我的div1");
},
play2:function(){
console.log("我的div2");
},
play3:function(){
console.log("我的div3");
}
}
})
}
</script>
</head>
<body>
<div id="my">
<div @click="play1">我的div1
<div @click="play2">我的div2
<div @click="play3">
我的div3
</div>
</div>
</div>
</div>
</body>
</html>

效果:

在上面的代码中,3个div分别绑定了3个不同的事件,点击"我的div3"的时候

那么该如何阻止事件冒泡呢?

1、原始JS中的处理方法

代码示例如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>事件冒泡</title>
<!--引入vue.js-->
<script src="node_modules/vue/dist/vue.js" ></script>
<script>
window.onload=function(){
// 构建vue实例
new Vue({
el:"#my",
data:{
},
// 方法
methods:{
play1:function(){
console.log("我的div1");
},
play2:function(){
console.log("我的div2");
},
play3:function(e){
console.log("我的div3");
e.stopPropagation();
}
}
})
}
</script>
</head>
<body>
<div id="my">
<div @click="play1">我的div1
<div @click="play2">我的div2
<div @click="play3($event)">
我的div3
</div>
</div>
</div>
</div>
</body>
</html>

效果:

2、vue中处理方法

代码示例如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>事件冒泡</title>
<!--引入vue.js-->
<script src="node_modules/vue/dist/vue.js" ></script>
<script>
window.onload=function(){
// 构建vue实例
new Vue({
el:"#my",
data:{
},
// 方法
methods:{
play1:function(){
console.log("我的div1");
},
play2:function(){
console.log("我的div2");
},
play3:function(e){
console.log("我的div3");
//e.stopPropagation();
}
}
})
}
</script>
</head>
<body>
<div id="my">
<div @click="play1">我的div1
<div @click="play2">我的div2
<div @click="play3($event)">
我的div3
</div>
<!--Vue中使用事件修饰符阻止冒泡-->
<div @click.stop="play3($event)">
我的div4
</div>
</div>
</div>
</div>
</body>
</html>

效果:

点击"我的div4"的时候会阻止事件冒泡,但点击"我的div3"的时候不会阻止事件冒泡。

三、事件的默认动作

看下面的代码示例:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>事件冒泡</title>
<!--引入vue.js-->
<script src="node_modules/vue/dist/vue.js" ></script>
<script>
window.onload=function(){
// 构建vue实例
new Vue({
el:"#my",
data:{
},
// 方法
methods:{
play1:function(){
console.log("我的div1");
},
play2:function(){
console.log("我的div2");
},
play3:function(e){
console.log("我的div3");
//e.stopPropagation();
},
play4:function(e){
console.log("我是超链接");
}
}
})
}
</script>
</head>
<body>
<div id="my">
<div @click="play1">我的div1
<div @click="play2">我的div2
<div @click="play3($event)">
我的div3
</div>
<!--Vue中使用事件修饰符阻止冒泡-->
<div @click.stop="play3($event)">
我的div4
</div> <a href="http://www.baidu.com" @click="play4($event)">click</a>
</div>
</div>
</div>
</body>
</html>

效果:

点击“click”的时候会发现页面跳转到了百度,不会进入play4事件,如果调试代码想进入play4事件该如何处理呢?

1、使用原生JS处理

代码示例如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>事件冒泡</title>
<!--引入vue.js-->
<script src="node_modules/vue/dist/vue.js" ></script>
<script>
window.onload=function(){
// 构建vue实例
new Vue({
el:"#my",
data:{
},
// 方法
methods:{
play1:function(){
console.log("我的div1");
},
play2:function(){
console.log("我的div2");
},
play3:function(e){
console.log("我的div3");
//e.stopPropagation();
},
play4:function(e){
console.log("我是超链接");
// 取消事件的默认动作
e.preventDefault();
}
}
})
}
</script>
</head>
<body>
<div id="my">
<div @click="play1">我的div1
<div @click="play2">我的div2
<div @click="play3($event)">
我的div3
</div>
<!--Vue中使用事件修饰符阻止冒泡-->
<div @click.stop="play3($event)">
我的div4
</div> <a href="http://www.baidu.com" @click="play4($event)">click</a>
</div>
</div>
</div>
</body>
</html>

效果:

这里在点击“click”的时候就不会进入百度首页了。这里没有处理冒泡,所以会触发play2和play1事件。

2、使用vue处理

代码示例如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>事件冒泡</title>
<!--引入vue.js-->
<script src="node_modules/vue/dist/vue.js" ></script>
<script>
window.onload=function(){
// 构建vue实例
new Vue({
el:"#my",
data:{
},
// 方法
methods:{
play1:function(){
console.log("我的div1");
},
play2:function(){
console.log("我的div2");
},
play3:function(e){
console.log("我的div3");
//e.stopPropagation();
},
play4:function(e){
console.log("我是超链接");
// 取消事件的默认动作
//e.preventDefault();
}
}
})
}
</script>
</head>
<body>
<div id="my">
<div @click="play1">我的div1
<div @click="play2">我的div2
<div @click="play3($event)">
我的div3
</div>
<!--Vue中使用事件修饰符阻止冒泡-->
<div @click.stop="play3($event)">
我的div4
</div> <a href="http://www.baidu.com" @click="play4($event)">click</a>
<!--使用vue处理-->
<a href="http://www.baidu.com" @click.prevent.stop="play4($event)">click2</a>
</div>
</div>
</div>
</body>
</html>

效果:

Vue:event对象的更多相关文章

  1. vue.js - 奇怪的 event 对象

    好久都没有写点东西了, 前段时间工作搞得头大,真的就是一起加班到死了.废话不多说,写这篇文章是因为这次因为 event 对象闹了一个乌龙,以此总结一下. 一.event 对象 (一)事件的 event ...

  2. vue中如何使用event对象

    原文地址 一.event 对象 (一)事件的 event 对象 你说你是搞前端的,那么你肯定就知道事件,知道事件,你就肯定知道 event 对象吧?各种的库.框架多少都有针对 event 对象的处理. ...

  3. vue事件获取事件对象,vue获取事件源,vue event.currentTarget

    js的事件,如点击事件,可以直接用this获取事件对象,而jQuery可以使用$(this)来获取事件对象.vue必须借助事件的 event 对象 的 currentTarget 才能获取事件对象 v ...

  4. JS:event对象下的target属性和取消冒泡事件

    1.target 通过获取DOM元素 var box = document.getElementById("box"); document.box.onclick = functi ...

  5. 一张图轻松搞懂javascript event对象的clientX,offsetX,screenX,pageX区别

    总是会被javascript的event对象的clientX,offsetX,screenX,pageX 弄得头晕,于是决定做个图来区分一下(画得我手那个酸呀....) 先总结下区别: event.c ...

  6. 【前端】原生event对象和jquery event对象的区别

    标准DOM event对象转换成 jQuery event对象 $(event) jQuery event对象转换成 标准DOM event对象 event.originalEvent

  7. dom事件与event对象总结

    1 事件:就是文档或浏览器窗口中发生的一些特定的交互瞬间.    tips:js和xhtml的交互是通过当用户或浏览器操作网页时发生的事件来处理的. 1.1 事件流:即事件的顺序.        事件 ...

  8. html EVENT对象

    Event 对象 Event 对象代表事件的状态,比如事件在其中发生的元素.键盘按键的状态.鼠标的位置.鼠标按钮的状态. 事件通常与函数结合使用,函数不会在事件发生前被执行! onabort 图像的加 ...

  9. HTML DOM Event对象

    我们通常把HTML DOM Event对象叫做Event事件 事件驱动模型 事件源:(触发事件的元素)事件源对象是指event对象 其封装了与事件相关的详细信息. 当事件发生时,只能在事件函数内部访问 ...

随机推荐

  1. vue 解决双向绑定中 父组件传值给子组件后 父组件值也跟着变化的问题

    说明: 近日开发中碰见一个很诡异的问题,  父组件动态的修改对象 data 中的值, 然后将这个对象 data 传给子组件, 子组件拿到后将 data 中的值 乘以 100 ,发现父组件中的值也跟着变 ...

  2. [环境]vscode中python虚拟环境

    在项目.vscode/settings.json下设置 { "python.pythonPath": "/path/to/python2.7"}

  3. AFP溢出攻击模块afp/loginext

    AFP溢出攻击模块afp/loginext   在苹果Mac OS X 10.3.3及以前版本,AFP服务存在缓存区溢出漏洞CVE-2004-0430.利用该漏洞,用户可以基于LoginExt包执行任 ...

  4. bzoj4337: BJOI2015 树的同构 树哈希判同构

    题目链接 bzoj4337: BJOI2015 树的同构 题解 树哈希的一种方法 对于每各节点的哈希值为hash[x] = hash[sonk[x]] * p[k]; p为素数表 代码 #includ ...

  5. 随机查出满足条件的5条数据(tp5)

    随机查出满足条件的5条数据 public function showQuestion() { $data[; $data[ $data['level'] = (int)$data['level']; ...

  6. 机器学习笔记(2):线性回归-使用gluon

    代码来自:https://zh.gluon.ai/chapter_supervised-learning/linear-regression-gluon.html from mxnet import ...

  7. PID控制器(比例-积分-微分控制器)- I

    形象解释PID算法 小明接到这样一个任务: 有一个水缸点漏水(而且漏水的速度还不一定固定不变),要求水面高度维持在某个位置,一旦发现水面高度低于要求位置,就要往水缸里加水. 小明接到任务后就一直守在水 ...

  8. C# 2015关键字

    关键字是对编译器具有特殊意义的预定义保留标识符. 它们不能在程序中用作标识符,除非它们有一个 @ 前缀. 例如,@if 是有效的标识符,但if 不是,因为 if 是关键字. 本主题中的第一个表列出的关 ...

  9. 自动化运维之-PXE实现系统批量自动安装

    转自:https://www.linuxidc.com/Linux/2017-10/147379.htm 本节索引 需求分析 PXE简介 整体方案 服务选择 功能实现 安装调试 错误分析 总结 1 需 ...

  10. one or more multiply defined symbols found

    在一个c++的.h文件中加入了这段代码: #include <string> using namespace std; std::string escapeStr(const std::s ...