Vue事件绑定以及事件修饰符
事件
要理解事件绑定,就得先了解事件。
浏览器是事件驱动型的,根据用户的行为触发不同的事件,根据事件执行相应的操作。我们较为熟悉的事件有三大类型:
鼠标键盘事件
鼠标键盘事件 | 事件介绍 |
---|---|
onclick | 鼠标点击某个对象 |
ondbclick | 鼠标双击某个对象 |
onmousedown | 某个鼠标按键被按下 |
onmouseup | 某个鼠标按键被松开 |
onmousemove | 鼠标被移动 |
onmouseover | 鼠标被移到某元素之上 |
onmouseout | 鼠标从某元素移开 |
onkeypress | 某个键盘的键被按下或按住 |
onkeydown | 某个键盘的键被按下 |
onkeyup | 某个键盘的键被松开 |
页面事件
页面事件 | 事件介绍 |
---|---|
onload | 某个页面或图像被完成加载 |
onunload | 用户退出页面 |
onresize | 窗口或框架被调整尺寸 |
onerror | 当加载文档或图像时发生某个错误 |
onabort | 图像加载被中断 |
表单相关事件
表单相关事件 | 事件介绍 |
---|---|
onblur | 元素失去焦点 |
onfocus | 元素获得焦点 |
onchange | 用户改变域的内容 |
onreset | 重置按钮被点击 |
onsubmit | 提交按钮被点击 |
onselect | 文本被选定 |
需要注意的是事件处理程序中的变量
event
保留着事件对象的信息,包括比如click
事件,事件属性里有点击位置相对于浏览器,以及页面的坐标信息,事件的类型(click
),触发事件的DOM节点信息等;可以将evenet
作为参数传递,在函数内部获取具体的evenet对象信息。
事件绑定
在Vue.js中
v-on
指令用来监听DOM
事件,并在触发事件时运行一些JavaScript
代码;当然v-on
也可以简写为@
<!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><title>事件绑定</title><script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script> </head><body><div id='app'><button v-on:click='func'> 显示 </button><h1> {{msg}} </h1></div><script>var vm = new Vue({el: '#app',data() {return {msg: '',}},methods: {func() {this.msg = '这是一个大大的H1'}},})</script> </body></html>
事件修饰符
Vue.js
为v-on
提供了事件修饰符来处理DOM
事件细节;Vue.js
通过由点(.
)表示的指令后缀来调用修饰符。
事件修饰符分类
Vue.js提供的事件修饰符主要针对两类情况:
冒泡机制修饰符
.stop
.capture
.self
事件本身修饰符
.prevent
.once
冒泡机制修饰符
事件冒泡
DOM
中,树状结构决定了子元素肯定在父元素里,所以点击子元素,就同时点击了子元素和父元素,以及父元素的父元素,以此类推,当然最终的根节点都是文档,以及window
。
试想,当一个子元素被点击的时候,不仅仅这个元素本身被点击了,因为这个元素也在其上一级父元素中(属于父级元素的地盘),所以相当于其父元素也被点击了,以此类推,一层一层往外推,最终整个文档也是被点击了,如果每个层级的节点元素都绑定了click
事件,那么每个节点的click
事件函数都会被执行。举个形象的例子,一个村里的人被打了(click
),首先就要按照村里的规矩处理,同时这个村属于某个乡镇,当然也是相当于这个乡镇的人被打了,那么也要按照这个乡镇的规矩处理,以此一层一层往上报。这个例子不准确的地方就是,现实中一个人因为一个事件只会被处理一次,不会因为同一件事情多次处理。
冒泡带来的烦恼
当上层(以及上上层,直至body
元素)父级有子元素同样的方法,但你子元素的事件后,所有父级元素的同名函数也会从下到上,由里往外,挨个执行,但是大多数情况下,我们只希望子当事元素事件执行,不希望层层执行,这就要想办法阻止这种冒泡的情况发生。比如我们点击Child Span
的时候只显示 Child Span
的内容。结合刚刚的例子就是,村里发生了打人事件,在村里解决了,就没必要一层一层往上报,在层层处理了。
事件修饰符
在Vue.js中针对Js事件本身的冒泡机制提供一些事件修饰符以便使用
.stop
: 阻止冒泡事件
<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><title>冒泡机制</title><script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script><style>#outer {width: 400px;height: 200px;background-color: aqua;position: absolute;}#inner {width: 200px;height: 100px;background-color: darkcyan;margin: 50px auto;}#btn {width: 40px;height: 30px;background-color: gold;margin: 35px 80px;}</style>
</head><body><div id='app'><div id="outer" @click='outer'><div id="inner" @click='inner'><button id="btn" @click.stop='btn'>按钮 </button></div></div></div><script>var vm = new Vue({el: '#app',methods: {inner() {console.log("inner触发了")},outer() {console.log("outer触发了")},btn() {console.log("btn触发了")}},})</script>
</body></html>
当点击按钮时,只会触发
button
本身的click
事件,不会继续传递
.self
: 只当事件在该元素本身(而不是子元素)触发时触发回调函数<div id="outer" @click='outer'><div id="inner" @click.self='inner'><button id="btn" @click='btn'>按钮 </button></div> </div>
当点击按钮时, 继续触发冒泡机制,因此
outter
盒子同样会触发对应的回调函数,但是inner
盒子并不会触发回调函数,只有点击inner
本身时,才会正常执行回调函数.capture
: 添加事件侦听器时使用事件捕获模式,即拥有该事件修饰符的元素会优先触发对应事件<div id="outer" @click.capture='outer'><div id="inner" @click='inner'><button id="btn" @click='btn'>按钮 </button></div> </div>
当点击按钮时, 继续触发冒泡机制,但是会优先触发
outer
的回调函数,其次,按照正常的冒泡顺序,由内向外
事件本身修饰符
.prevent
:阻止默认行为
<!DOCTYPE html>
<html lang="zh-CN"><head><meta charset="UTF-8"><title>VueDemo</title><script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script><style>form {width: 210px;height: 300px;position: relative;margin: 0 auto;}.user {width: 200px;height: 20px;display: block;margin: 5px auto;}#btn {width: 70px;float: right;}</style>
</head><body><div id='app'><form action="/userinfo" method="POST" v-on:submit.prevent='onsubmit'><input type="text" name="user" class="user" v-model='user.name' placeholder="请输入用户名。。。"><input type="password" name="user" class="user" v-model='user.pwd' placeholder="请输入密码。。。"><input type="submit" id="btn" value="提交"></form></div><script>var vm = new Vue({el: '#app',data() {return {user: {name: "",pwd: ""}}},methods: {onsubmit() {console.log(`表单信息:${this.user.name}和${this.user.pwd}提交`)}},})</script>
</body></html>
表单本身的提交行为会进行页面跳转,现在使用
.prevent
修饰符之后,只执行绑定的方法,不跳转页面;类似的还有超链接等的默认行为都可以使用该修饰符阻止
.once
: 事件只能触发一次<!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><title>VueDemo</title><script src='https://cdn.jsdelivr.net/npm/vue/dist/vue.js'></script> </head><body><div id='app'><button @click.once='btn'> 你只能评论一次 </button></div><script>var vm = new Vue({el: '#app',methods: {btn() {alert("已评论")}},})</script> </body></html>
Vue事件绑定以及事件修饰符相关推荐
- 六十二、Js中的冒泡和捕获点击事件和Vue组件绑定原生事件
2020/10/18 . 周日.今天又是奋斗的一天. @Author:Runsen @Date:2020/10/18 写在前面:我是「Runsen」,热爱技术.热爱开源.热爱编程.技术是开源的.知识是 ...
- VUE3 之 多个 v-model 绑定及 v-model 修饰符的使用
目录 1. 概述 2. 多个 v-model 绑定 3. v-mode 修饰符 4. 综述 5. 个人公众号 1. 概述 洛克定律告诉我们: 当我们的目标很远大,远到我们都看不到终点时,放弃几率就会很 ...
- addeventlistener事件第三个参数_简析JavaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序...
这篇文章主要介绍了javaScript 事件绑定.事件冒泡.事件捕获和事件执行顺序整理总结的相关资料 (一)事件绑定的几种方式 javascript给DOM绑定事件处理函数总的来说有2种方式:在htm ...
- 事件绑定、事件监听、事件委托
2019独角兽企业重金招聘Python工程师标准>>> 在JavaScript的学习中,我们经常会遇到JavaScript的事件机制,例如,事件绑定.事件监听.事件委托(事件代理)等 ...
- 你真的理解事件绑定、事件冒泡和事件委托吗?
一文了解Web API中的事件绑定.事件冒泡.事件委托 引言 正文 一.事件绑定 1.事件和事件绑定时什么? 2.事件是如何实现的? 二.事件冒泡 1.事件模型 2.事件模型解析 (1)捕获阶段 (2 ...
- javascript的事件绑定与事件委托
昨天有位web前端爱好者问关于javascript事件绑定和事件委托的知识,小编今天就来跟大家交流一下这个知识点! 事件绑定:事件是用户或者浏览器自身进行的特定的行为,这些事件都有自己特定的名字,如: ...
- 简析JavaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序
JavaScript 事件绑定.事件冒泡.事件捕获和事件执行顺序 这篇文章主要介绍了javaScript 事件绑定.事件冒泡.事件捕获和事件执行顺序整理总结的相关资料 (一)事件绑定的几种方式 jav ...
- 事件绑定,事件监听,事件委托
事件绑定,事件监听,事件委托 事件绑定 一个元素只能绑定一个事件 obj.on+事件名称=funciton(){} 事件监听 事件监听可以监听很多很多事件. this指向当前调用触发事件的主体对象. ...
- Vue——v-model的三种修饰符lazy、number、trim
Vue--v-model的三种修饰符lazy.number.trim v-model.lazy:值修改操作完成之后才会发生变化. v-model.number:值修改时,保持其值为Number类型. ...
- HTML——jQuery之事件绑定、取消事件绑定及事件委托
事件绑定 事件绑定有两种方法:分别是:.click() 和.on() <!DOCTYPE html> <html lang="en"> <head&g ...
最新文章
- WebService系列之使用Axis获取天气预报数据
- [转载] python3基础语法(注释、缩进)_1.02
- 【每日算法Day 102】美团 AI 平台算法工程师面试编程题
- atom之插件安装及相关
- UITableView(二)
- 经典面试题 之 JVM调优
- 作为IT男必须会Linux服务器被攻击后如何处理!网友:这个要会!
- 3DES实现加密算法
- 音视频开发技术,让智能家居更智能!
- ubuntu默认壁纸位置
- 利用Python提取函数图像数据并拟合曲线
- SpringBoot 雪花算法生成商品订单号【SpringBoot系列13】
- 【故障】nginx间隙性出现502 错误,linux学习ppt
- html 标题字体修改,如何更改HTML标题字体大小?
- linux服务器离线安装autoconf
- 微型计算机硬件系统中PROM是,1微型计算机硬件系统中最核心的部件是CPU.doc
- c语言的复试笔试题目,c语言面试最必考的十道试题,求职必看!!!
- 如何进行文档翻译?文档翻译的软件有哪些?
- 计算机演示文稿教学实例课件,ppt课件制作基本要求及ppt教学案例
- 远程视频监控:MJPG-Streamer
热门文章
- 企业邮箱如何购买,公司企业邮箱在哪申请?
- [力扣cpp实现] 589. N叉树的前序遍历
- 边玩边学,15个学习Python 的编程游戏网站!
- 民间治高血压的偏方集锦!!!
- 利用jenkins搭建发布系统
- docker(11、Docker Swarm4)11、副本数量(replicated 和 global )12、Label 控制 Service 的位置 13、如何配置 Health Check
- 让百度地图生成器里的“标注”内容展开--解决方案
- C# 猜数字小游戏
- 【Linux】Linux 权限和权限管理
- php.ini 里的 upload_tmp_dir =C:\WINDOWS\Temp\ 无效