当前位置: 首页 > news >正文

Vue实现多个input输入,光标自动聚焦到下一个input

遇到一个需求,需要实现和移动端短信输入一样,输入内容后,光标会进入下一个输入框

需要用到2个事件 
keydown事件发生在键盘的键被按下的时候

keyup 事件在按键被释放的时候触发

<template><div class="box"><el-form class="demo-ruleForm" ref="form" :model="form" :rules="rules"><el-form-item class="form-item" label="身高" prop="Height">// 此处为了做校验处理<el-input type="text" v-model="Height" v-show="false"></el-input><span v-for="(item,index) in HeightList" :key="index"><input type="text" v-model="item.val" class="border-input" maxlength="1" @keyup="nextFocu($event,index, 1)" @keydown="changeValue(index,$event)" /></span><span class="text">cm</span></el-form-item></el-form></div>
</template><script>
const form = {Height: '', // 身高Weight: '' // 体重
}
export default {data () {const validatePass = (rule, value, callback) => {if (value.length < 3) {callback(new Error('请输入'))} else if (isNaN(value)) {callback(new Error('请输入数字'))} else {if (value <= 99) {callback(new Error('小于99'));} else if (value >= 251) {callback(new Error('大于251'))} else {callback()}}}const validatePass2 = (rule, value, callback) => {console.log(value)if (value.length < 4) {callback(new Error('请输入'))} else if (isNaN(value)) {callback(new Error('请输入数字'))} else {if (value < '0200') {callback(new Error('不能以0开头'))} else if (value > '2000') {callback(new Error('不能大于2000'))} else {callback()}}}return {Height: '', // 身高Weight: '', // 体重form: { ...form },HeightList: [{val: ''},{val: ''},{val: ''}],WeightList: [{val: ''},{val: ''},{val: ''},{val: ''}],rules: {Height: [{ validator: validatePass, trigger: ['focus', 'blur', 'change'] },],Weight: [{ validator: validatePass2, trigger: ['focus', 'blur', 'change'] },]}}},methods: {// 下一个文本框nextFocu (el, index, type) {let list = this[type === 1 ? 'HeightList' : 'WeightList'];let field = type === 1 ? "Height" : "Weight";let val = list[index].val;var dom = document.getElementsByClassName(el.srcElement.className),currInput = dom[index],nextInput = dom[index + 1],lastInput = dom[index - 1];if (el.keyCode != 8) {//禁止输入非数字类型if (!val.replace(/\D/g, '')) {list[index].val = "";return}if (index < (list.length - 1)) {nextInput.focus();} else {currInput.blur();}} else {if (index != 0) {lastInput.focus();}}// 数据转成字符串this.form[field] = list.map(item => { return item.val }).join('')// 重新赋值this[field] = this.form[field]},/*当键盘按下的时候清空原有的数*/changeValue (index, el) {if (el.keyCode !== 32) {this.HeightList[index].val = "";}}}
}
</script><style lang="less" scoped>
.border-input {background: #ffffff;width: 24px;font-size: 24px;height: 24px;margin-left: 8px;text-align: center;border: 1px solid #ccc;border-radius: 4px;
}
.box {width: 400px;margin: 0 auto;border: 1px solid #ccc;
}
/deep/.el-form-item__content {text-align: right;
}
/deep/ .el-form-item__error {position: absolute;right: 20px;
}
</style>

http://www.lryc.cn/news/302220.html

相关文章:

  • 人工智能技术应用笔记(二):OpenAI SORA文生视频模型技术报告全文中英对照 (GPT4翻译+人工润色)
  • Linux-系统资源管理的命令
  • Html的<figure><figcaption>标签
  • Selenium实现多页面切换
  • Electron实战之菜单与托盘
  • 【Java EE初阶十六】网络原理(一)
  • 51_蓝桥杯_led流水灯
  • ⭐北邮复试刷题589. N 叉树的前序遍历__DFS (力扣每日一题)
  • php伪协议之phar
  • 蓝桥杯电子类单片机提升三——NE555
  • 发掘GPT-4商业创新的潜力
  • LeetCode42.接雨水(单调栈)
  • 黄东旭:“向量数据库”还是“向量搜索插件 + SQL 数据库”?丨我对 2024 年数据库发展趋势的思考
  • Spark编程实验五:Spark Structured Streaming编程
  • 【已解决】引发的异常: 0xC0000005: 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突。
  • Python Flask高级编程之RESTFul API前后端分离(学习笔记)
  • Windows如何打开投影到此电脑
  • 【BUG】段错误
  • 深入理解指针(3)
  • ssm在线学习平台-计算机毕业设计源码09650
  • 【Linux 内核源码分析】内存映射(mmap)机制原理
  • 贪心算法之合并区间
  • Eclipse - Colors and Fonts
  • java 数据结构LinkedList类
  • 第五次作业(防御安全)
  • 阿里云香港轻量应用服务器是什么线路?
  • C# Winform .net6自绘的圆形进度条
  • Git基本操作(超详细)
  • 【AGI视频】Sora的奇幻之旅:未来影视创作的无限可能
  • Docker部署nginx