前言:
此时同学们对“js阻止事件冒泡的两种方法”都比较着重,我们都想要学习一些“js阻止事件冒泡的两种方法”的相关资讯。那么小编在网上汇集了一些有关“js阻止事件冒泡的两种方法””的相关资讯,希望同学们能喜欢,你们快快来学习一下吧!事件绑定基本用法
我们实现一个复杂的web应用,少不了与用户的交互,那么用户交互最直接相关的就是事件,我们上一章学习的数据双向绑定的v-model指令的底层就是用到了事件,所以VUE专门提供了事件处理这种语法结构,其实本质上还是指令。所以我们称之为事件绑定。之前我们学到了数据绑定,其实是类似的,数据绑定是将数据与模板绑定起来,只不过对于事件绑定来说,它绑定的是具体的操作。接下来我们学习下,VUE如何来处理事件。
1、VUE如何处理事件
v-on指令用法
<button v-on:click='count+=2'>点击1</button>v-on简写形式
<button @click='count+=2'>点击2</button>
完整代码:
<!DOCTYPE html><html lang="en"><body> <div id="app"> <div>{{count}}</div> <button v-on:click='count+=2'>点击1</button> <button @click='count+=2'>点击2</button> </div> <script type="text/javascript" src="vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el:'#app', data:{ count:0 } }); </script> </body></html>
展示效果图:
2、事件函数的调用方式
以上我们调用事件是直接在指令内写的业务逻辑,那么如果比较复杂的业务逻辑再直接写到指令内那肯定是不合理了,这时我们要抽取函数,通过事件函数的方式来调用,VUE中也专门提供了一个属性(methods)用来定义我们需要的方法。
直接绑定函数名称
<button @click='todo'>点击3</button>调用函数
<button @click='todo()'>点击4</button>
完整代码:
<!DOCTYPE html><html lang="en"><body> <div id="app"> <div>{{count}}</div> <button @click='todo'>点击3</button> <button @click='todo()'>点击4</button> </div> <script type="text/javascript" src="vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el:'#app', data:{ count:0 }, methods:{ todo:function(){ this.count+=2; } } }); </script> </body></html>
展示效果:
注意:在使用方法的时候,我们用到了this.count+,为什么用this呢,因为count在方法内部,在方法内部是没办法访问这个属性的,我们大可认为data和methods是vm实例下的2个子域,他们2个是没办法直接交互的,只能往上通过父域(vm)来访问,所以这里的this就是vm实例对象,比如我在方法内部打印下console.log(this===vm) 返回的是true。
methods内可以定义多个方法。
3、事件函数参数传递
如果我们的事件调用中不需要传递参数,那么以上第一种(直接绑定函数名称)比较方便一些;
如果我们的事件中需要传递参数,我们只能通过以上第二种(调用函数)的方式进行函数调用;
当我们需要传递参数的时候,根据入参的分类可以分为普通参数和事件对象,下边来看下事件函数如何来传递这2中类型的参数:
参数传递
<button @click='todo(11,22,$event)'>点击</button>
完整代码:
<!DOCTYPE html><html lang="en"><body> <div id="app"> <div>{{count}}</div> <button @click='todo(11,22,$event)'>点击</button> </div> <script type="text/javascript" src="vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el:'#app', data:{ count:0 }, methods:{ todo:function(p1,p2,event){ console.log(p1); console.log(p2); console.log(event.target.tagName + " " + event.target.innerHTML); this.count+=2; } } }); </script> </body></html>
展示效果图:
其实,我们通过第一种方式(直接绑定函数名称)来调用函数的时候,是没办法从传递普通参数的,但是它默认绑定了事件对象。我们可以在方法内部直接获取事件。
<!DOCTYPE html><html lang="en"><body> <div id="app"> <div>{{count}}</div> <button @click='todo'>点击</button> </div> <script type="text/javascript" src="vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el:'#app', data:{ count:0 }, methods:{ todo:function(event){ console.log(event.target.tagName + " " + event.target.innerHTML); this.count+=2; } } }); </script> </body></html>
展示效果:
总结:参数传递
1、如果事件直接绑定的是函数名称(直接绑定函数名称 todo),那么默认会传递事件对象作为事件函数的第一个参数
2、如果事件函数绑定的是函数调用(函数调用 todo()),那么事件对象必须作为最后一个参数显示的传递,并且事件对象的名称必须是$event
4、事件修饰符
下边来看个例子:
<!DOCTYPE html><html lang="en"><body> <div id="app"> <div>{{count}}</div> <div @click='todo2'> <button @click='todo'>点击</button> </div> </div> <script type="text/javascript" src="vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el:'#app', data:{ count:0 }, methods:{ todo:function(event){ }, todo2:function(event){ console.log(event.target.tagName + " " + event.target.innerHTML); this.count+=2; } } }); </script> </body></html>
展示效果:
分析:在代码中,button绑定的todo方法是没有实现的,理论上是没有反应的,但从展示效果来看,是执行了todo2方法,为什么呢?这是因为事件冒泡到了它的父级元素div上,所以才执行了todo2方法,这就叫做冒泡,一个从子元素向父元素传递事件的行为。那么这种情况显然不是我们预想的,那怎么办呢。阻止冒泡,有2种方式解决:
第一种:原生js
event.stopPropagation();
第二种:vue提供的修饰符
.stop 阻止冒泡
<button @click.stop='todo'>点击</button>
完整代码:
<!DOCTYPE html><html lang="en"><body> <div id="app"> <div>{{count}}</div> <div @click='todo2'> <button @click.stop='todo'>点击</button> </div> </div> <script type="text/javascript" src="vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el:'#app', data:{ count:0 }, methods:{ todo:function(event){ console.log('111'); //阻止冒泡 //event.stopPropagation(); }, todo2:function(event){ console.log(event.target.tagName + " " + event.target.innerHTML); this.count+=2; } } }); </script> </body></html>
展示效果:
.stop 的存在就相当于阻止事件向父元素传递,保证只执行todo
阻止默认行为(取消默认事件)
在实际开发中,有的时候,我们想要改变某些组件原生的动作,比如默认情况下,如果我点击一个<a>标签,那么默认会自动跳转到href对应的链接上去。如果我想要阻止这些原生的动作行为,而是仅仅需要功能完成执行我们的function函数。那么这时候,我们就要使用prevent了,我们来举一个例子看看:
<!DOCTYPE html><html lang="en"><body> <div id="app"> <a href="; @click.prevent="func">百度</a> </div> <script type="text/javascript" src="vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el:"#app", data: { count:0 }, methods:{ func:function(){ alert('阻止a标签原先点击跳转的默认行为。') } } }); </script> </body></html>
展示效果:
除了以上经常用的2个以外,官网还提供了其它修饰符,有兴趣的可以研究下使用场景
5、按键修饰符
在以往的页面交互中,我们常常会遇到这种需求:当用户输入账号密码后点击 Enter 键、一个多选筛选条件通过点击多选框后自动加载符合选中条件的数据等等。在传统的前端开发中,当我们碰到这种类似的需求时,我们往往需要知道 js 中需要监听的按键所对应的 keyCode,然后通过判断 keyCode 得知用户是按下了那个按键,继而执行后续的操作。例如,在下面的示例中,当我们松开 Enter 按键后控制台就会打印出姓名输入框内的值。
<label>姓名:</label> <input id="name" type="text"> $('#name').on('keyup',function(event){ event.preventDefault();//阻止浏览器默认动作 if(event.Code == 13){ console.log($(this).val()); } });
而在 Vue 中,给我们提供了一种便利的方式去实现监听我们的按键事件。在监听键盘事件时,我们经常需要查找常见的按键所对应的 keyCode,而 Vue 为最常用的按键提供了别名。
在下面的代码中,我们同样监听了 input 框的 Enter 事件,而我们只需要在绑定的 input 标签的 keyup 事件上添加 .enter 修饰符即可。
<!DOCTYPE html><html lang="en"><body> <div id="app"> <label>姓名:</label> <input id="name" type="text" v-model:value="name" @keyup.enter="log"> </div> <script type="text/javascript" src="vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el: '#app', data: { name: '' }, methods: { log:function() { console.log(`name:${this.name}`); } } }) </script> </body></html>
展示效果:
6、自定义按键
对于标准的104键盘,Vue 不可能帮我们把所有的按键键值都定义好,这也不现实。于是,Vue 给我们提供了一种通过定义全局 config.keyCodes 来自定义按键修饰符的别名的方式。例如,在上面的例子中,我们是通过 Enter 按键获取到输入的文本框的值,现在,我们的需求变了,需要我们通过 F2 按键来获得文本框的值,这时我们就可以通过自定义按键修饰符来实现操作。
<!DOCTYPE html><html lang="en"><body> <div id="app"> <label>姓名:</label> <input id="name" type="text" v-model:value="name" @keyup.prevent.f2="logF2"> </div> <script type="text/javascript" src="vue.js"></script> <script type="text/javascript"> //通过 keyCode 自定义按键修饰符 Vue.config.keyCodes.f2 = 113 var vm = new Vue({ el: '#app', data: { name: '' }, methods: { logF2:function() { console.log(`name:${this.name} --- 通过 F2 按键获得`); } } }) </script> </body></html>
这时,通过enter键已经不生效了,只有恩f2才能实现功能。
规则:自定义按键修饰符名字是自定义的,但对应的值必须是按键对应event.keyCode值。
上一篇:VUE入门教程(二)之模板语法(指令)
标签: #js阻止事件冒泡的两种方法