从聚焦到失去焦点,以下事件会根据情况,先后判断是否会执行。

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输入框事件流程变化相关推荐

  1. 实时监听input输入框value的变化:

    HTML5 标准事件 oninput 和 IE 专属事件 onpropertychange 事件实时监听输入框value的变化 oninput 事件在用户输入时触发. 该事件在 <input&g ...

  2. html 输入框输入事件,input输入框事件

    onfocus -> 键盘输入 -> onkeydown -> onkeypress -> onkeyup -> oninput -> 失去焦点 ->  on ...

  3. js实时监听input输入框值的变化以便即使匹配搜索项

    问题说明 在含有搜索框的网页中,经常需要及时匹配搜索项,因此需要监听input输入框的变化事件.如果使用 onkeydown.onkeypress.onkeyup 这个几个键盘事件来监测的话,除了监听 ...

  4. vue input输入框事件

    一.@input(或者是v-on:input) 每输入一个字符都会触发该事件,用于实时查询. <input type="text" placeholder="通过乘 ...

  5. 实时监听 input输入框值的变化 并响应动作

    html <input type="text" id="id"> jquery $("#id").bind('input pro ...

  6. input输入框的input事件和change事件

    input输入框的onchange事件,要在 input 失去焦点的时候才会触发: 在输入框内容变化的时候不会触发change,当鼠标在其他地方点一下才会触发: onchange 事件也可用于单选框与 ...

  7. vue输入框输入触发事件_.vue文件中监听input输入事件oninput详解

    .vue文件其实是一个组件,关于它的说明我之前也写过一篇文章,地址:.vue文件,今天这篇文章要讲的是.vue文件中监听input的输入值变化事件.需求是这页面中,改变input的值,就调用一个事件, ...

  8. input输入框的事件监听

    主要涉及到的事件有:change, input,propertychange 针对IE浏览器(IE11测试): change事件: 输入框内容变化且失去焦点,触发change事件. <input ...

  9. 说说 input 输入框的事件

    1.从input框获取焦点到,输入值,失去焦点这个过程所有事件,以及一些特点: 过程:onfocus -> 键盘输入 -> onkeydown -> onkeypress -> ...

最新文章

  1. C代码开发遇到的问题 变量初始化和结构体指针移动
  2. 初学者先学python语音好吗_献给Python初学者 零基础学习Python能学会吗
  3. Android Studio Linking an external C++ project 时候 报Invalid file name. Expected: CMakeLists.txt
  4. 微软的FreeBSD社区推广活动 北京站,你没看错!微软现在是一家名副其实的开源公司
  5. linux开热点软件,在Ubuntu系统的电脑上开启无线热点全攻略,
  6. Codeforces 963B Destruction of a Tree 【贪心】
  7. Windows下使用VS2008+CUDA3.0开发的详细配置 (Setup CUDA 3.0 on VS2008 in Windows)
  8. 74、shape 画圆 加 边框
  9. 【手写数字识别】基于matlab RBF手写数字识别【含Matlab源码 471期】
  10. WinRAR_v6.01压缩文件包必备软件
  11. 2022官网下载jdk8教程
  12. Java POI 合并单元格操作以及代码示例
  13. 干货3分钟搞懂私募投资以及技术面试
  14. PS 渐变工具使用
  15. 数据库索引的填充因子
  16. ip关联是什么意思,亚马逊如何防止ip关联(ip关联过多是什么意思)
  17. 设计模式五:原型模式
  18. vue+elementUI+vue-i18n 实现国际化
  19. jenkins报错:java.lang.illegalstateexception already existed will not overwrite with
  20. 【视频教程】帝国CMS模板开发制作系列教程03

热门文章

  1. 五分钟掌握微信小程序轮播图
  2. 数组——洛谷#P1427 小鱼的数字游戏(Python实现)
  3. PHP的环境安装基本的配置
  4. 如何判断List 集合和Map 集合是否为空
  5. fixed 和setprecision()的用法
  6. oracle索引一般叫什么意思,什么是oracle索引?
  7. scrapy框架学习之demo2
  8. 小程序助力银行数字化转型
  9. 迟到的2020年终总结
  10. 核电站计算机专业是干什么的,什么叫核电站?它是干什么用的呢?