input输入框事件流程变化
从聚焦到失去焦点,以下事件会根据情况,先后判断是否会执行。
onfocus -> 键盘输入 -> onkeydown -> onkeypress -> onkeyup -> oninput -> 失去焦点 -> onchange -> onblur
onfocus 聚焦事件
无论是用户主动的聚焦行为还是代码的强制聚焦,只要是由失去焦点的状态变为聚焦的状态都会触发这一事件。
<template><div class="hello"><input type="text" @focus="onfocus" ref="input1"><button @click="focusbtn"> foucs </button></div>
</template><script>
export default {name: 'HelloWorld',props: {msg: String},methods: {onfocus () {console.log('聚焦执行')},focusbtn () {// 代码控制聚焦this.$refs.input1.focus()}}
}
</script>
如果本身就是聚焦状态,多次执行聚焦则不会执行
<template><div class="hello"><input type="text" @focus="onfoucs" ref="input1"><button @click="foucsbtn"> foucs </button></div>
</template><script>
export default {name: 'HelloWorld',props: {msg: String},methods: {onfoucs () {console.log('聚焦执行')},foucsbtn () {// 代码控制聚焦,onfoucs只会执行一次this.$refs.input1.focus()this.$refs.input1.focus()this.$refs.input1.focus()}}
}
</script>
<template><div class="hello"><input type="text" @focus="onfoucs" ref="input1"><button @click="foucsbtn"> foucs </button></div>
</template><script>
export default {name: 'HelloWorld',props: {msg: String},methods: {onfoucs () {console.log('聚焦执行')},foucsbtn () {// 代码控制聚焦this.$refs.input1.focus()this.$refs.input1.blur()// 失去焦点后再聚焦,onfoucs则会再执行一次this.$refs.input1.focus()}}
}
</script>
这也又一次应证了,只有从失去焦点状态变为聚焦,@focus才会执行。
onkeydown 键盘按键按下事件
每一个键的触发都有三个步骤 按下keydown,按住press,抬起keyup,如果有按键输入,keydown会率先触发
<template><div class="hello"><input type="text" @keydown="keydown" @keypress="keypress" @keyup="keyup"><button @click="foucsbtn"> foucs </button></div>
</template><script>
export default {name: 'HelloWorld',props: {msg: String},methods: {keydown () {console.log('按下')},keypress () {console.log('按住')},keyup () {console.log('抬起')}}
}
</script>
效果
但是,如果一直按住按键不松手,keydown也会一直执行
效果
onkeypress 键盘按键按住事件
每一个键的触发都有三个步骤 按下keydown,按住press,抬起keyup,如果有按键输入,keydown触发后,只要不松开按键,onkeypress 会和onkeydown一起一直触发
onkeyup 键盘按键松开事件
每一个键的触发都有三个步骤 按下keydown,按住press,抬起keyup,如果有按键输入,松开按键的一瞬间会触发一次onkeyup事件,一般来说,keydown和keyup选择一个使用就可以了
oninput 输入值变化事件
当input输入框的值发生变化时,就会触发,一般用户输入内容,会变化很多次,如果不做防抖处理,oninput的事件会执行很多次
<template><div class="hello"><input type="text" @input="onInput" @keydown.enter="onEnter"></div>
</template><script>
export default {name: 'HelloWorld',props: {msg: String},methods: {onEnter () {console.log('按下enter')},onInput () {console.log('改变了')}}
}
</script>
按下回车键这个行为不会触发oninput事件
onchange 失去焦点后的输入值变化事件
当用户输入完成后,无论是按了一下回车键,还是点击了其它地方,或者代码控制失去焦点,都有可能触发onchange 事件。是否触发的另外一个条件就是,与上一次失去焦点的值相比,此时input框内的值是否发生变化,如果变化了,则触发onchange,没有变化则不触发
<template><div class="hello"><input type="text" @change="onchange"></div>
</template><script>
export default {name: 'HelloWorld',props: {msg: String},methods: {onchange () {console.log('改变了')}}
}
</script>
这里涉及到开发中常用的另外一个问题,当用户敲击回车键后,onchange事件仍有可能触发。如果input框同时绑定了onchange事件,也绑定了对回车键的监听,如果在按下回车键前,input框的值发生变化,这两个事件一定都会触发。
<template><div class="hello"><input type="text" @change="onchange" @keydown.enter="onEnter"></div>
</template><script>
export default {name: 'HelloWorld',props: {msg: String},methods: {onEnter () {console.log('按下enter')},onchange () {console.log('改变了')}}
}
</script>
按下enter键虽然没有失去焦点,但也有可能会触发onchange事件
如果开发希望将这两个事件同时绑定,又从功能上要求完全分开,就需要input输入框的值是否发生变化,如果没有发生变化,只会执行回车事件,如果发生了变化,则阻止回车事件,因为onChange会执行
<template><div class="hello"><input type="text" @change="onchange" @keydown.enter="onEnter"></div>
</template><script>
export default {name: 'HelloWorld',props: {msg: String},data () {return {initValue: ''}},methods: {onEnter (e) {const val = e.target.valueif (val === this.initValue) {// 表示onChange不会执行,所以得执行console.log('按下enter')}},onchange (e) {this.initValue = e.target.valueconsole.log('改变了')}}
}
</script>
输入后第一次按下回车,onenter虽然会触发,但我们的不想要执行的console.log并没有执行。
再次多次点击回车,不会再执行onchange,因为值没有变化
再次说明,失去焦点后,会先判断onchange是否执行,再执行onblur
<template><div class="hello"><input type="text" @change="onchange" @keydown.enter="onEnter" @blur="onblur"></div>
</template><script>
export default {name: 'HelloWorld',props: {msg: String},data () {return {initValue: ''}},methods: {onEnter (e) {const val = e.target.valueif (val === this.initValue) {// 表示onChange不会执行,所以得执行console.log('按下enter')}},onchange (e) {this.initValue = e.target.valueconsole.log('改变了')},onblur () {console.log('失去焦点了')}}
}
</script>
onblur 失去焦点事件
当用户输入完成后,无论点击了其它地方,或者代码控制失去焦点,只要有聚焦到失去焦点这一变化,就一定会触发onblur,如果原本就是失去焦点状态,再次失去焦点,onblur事件不会再触发。
<template><div class="hello"><input type="text" @change="onchange" @blur="onblur" ref="input1"><button @click="clickBtn">失去焦点</button></div>
</template><script>
export default {name: 'HelloWorld',props: {msg: String},data () {return {initValue: ''}},methods: {clickBtn (e) {this.$refs.input1.blur()this.$refs.input1.blur()this.$refs.input1.blur()},onblur () {console.log('失去焦点了')}}
}
</script>
无论怎么点击按钮都不会触发
<template><div class="hello"><input type="text" @change="onchange" @blur="onblur" ref="input1"><button @click="clickBtn">失去焦点</button></div>
</template><script>
export default {name: 'HelloWorld',props: {msg: String},data () {return {initValue: ''}},methods: {clickBtn (e) {this.$refs.input1.blur()this.$refs.input1.blur()// 如果聚焦后再失去焦点,则会触发一次onblurthis.$refs.input1.focus()this.$refs.input1.blur()},onblur () {console.log('失去焦点了')}}
}
</script>
点击一次按钮
但是,按下回车,并不会失去焦点,onblur不会触发
<template><div class="hello"><input type="text" @change="onchange" @keydown.enter="onEnter" @blur="onblur"></div>
</template><script>
export default {name: 'HelloWorld',props: {msg: String},data () {return {initValue: ''}},methods: {onEnter (e) {console.log('按下enter')},onblur () {console.log('失去焦点了')}}
}
</script>
说明,vue的input输入框事件是从原生的input输入框封装而来的,所以对于原生html input输入框事件,与上述说明一致。
input输入框事件流程变化相关推荐
- 实时监听input输入框value的变化:
HTML5 标准事件 oninput 和 IE 专属事件 onpropertychange 事件实时监听输入框value的变化 oninput 事件在用户输入时触发. 该事件在 <input&g ...
- html 输入框输入事件,input输入框事件
onfocus -> 键盘输入 -> onkeydown -> onkeypress -> onkeyup -> oninput -> 失去焦点 -> on ...
- js实时监听input输入框值的变化以便即使匹配搜索项
问题说明 在含有搜索框的网页中,经常需要及时匹配搜索项,因此需要监听input输入框的变化事件.如果使用 onkeydown.onkeypress.onkeyup 这个几个键盘事件来监测的话,除了监听 ...
- vue input输入框事件
一.@input(或者是v-on:input) 每输入一个字符都会触发该事件,用于实时查询. <input type="text" placeholder="通过乘 ...
- 实时监听 input输入框值的变化 并响应动作
html <input type="text" id="id"> jquery $("#id").bind('input pro ...
- input输入框的input事件和change事件
input输入框的onchange事件,要在 input 失去焦点的时候才会触发: 在输入框内容变化的时候不会触发change,当鼠标在其他地方点一下才会触发: onchange 事件也可用于单选框与 ...
- vue输入框输入触发事件_.vue文件中监听input输入事件oninput详解
.vue文件其实是一个组件,关于它的说明我之前也写过一篇文章,地址:.vue文件,今天这篇文章要讲的是.vue文件中监听input的输入值变化事件.需求是这页面中,改变input的值,就调用一个事件, ...
- input输入框的事件监听
主要涉及到的事件有:change, input,propertychange 针对IE浏览器(IE11测试): change事件: 输入框内容变化且失去焦点,触发change事件. <input ...
- 说说 input 输入框的事件
1.从input框获取焦点到,输入值,失去焦点这个过程所有事件,以及一些特点: 过程:onfocus -> 键盘输入 -> onkeydown -> onkeypress -> ...
最新文章
- C代码开发遇到的问题 变量初始化和结构体指针移动
- 初学者先学python语音好吗_献给Python初学者 零基础学习Python能学会吗
- Android Studio Linking an external C++ project 时候 报Invalid file name. Expected: CMakeLists.txt
- 微软的FreeBSD社区推广活动 北京站,你没看错!微软现在是一家名副其实的开源公司
- linux开热点软件,在Ubuntu系统的电脑上开启无线热点全攻略,
- Codeforces 963B Destruction of a Tree 【贪心】
- Windows下使用VS2008+CUDA3.0开发的详细配置 (Setup CUDA 3.0 on VS2008 in Windows)
- 74、shape 画圆 加 边框
- 【手写数字识别】基于matlab RBF手写数字识别【含Matlab源码 471期】
- WinRAR_v6.01压缩文件包必备软件
- 2022官网下载jdk8教程
- Java POI 合并单元格操作以及代码示例
- 干货3分钟搞懂私募投资以及技术面试
- PS 渐变工具使用
- 数据库索引的填充因子
- ip关联是什么意思,亚马逊如何防止ip关联(ip关联过多是什么意思)
- 设计模式五:原型模式
- vue+elementUI+vue-i18n 实现国际化
- jenkins报错:java.lang.illegalstateexception already existed will not overwrite with
- 【视频教程】帝国CMS模板开发制作系列教程03