当前位置: 首页 > Web前端 > vue.js

实现回车键切换窗体的输入元素焦点

时间:2023-03-31 22:46:30 vue.js

写登录注册功能的时候,进入一个输入框后,习惯性的按回车键切换到下一个输入框,但是这个时候我还没有实现这个功能...emm试一试(接地气)自从Tab键可以切换焦点,把Tab键的功能转移到回车键上岂不是很好,即表面上按的是回车键,但“实际”按下的是Tab键,所以尝试通过人工事件(syntheticevents))来实现。创建并触发事件:https://developer.mozilla.org...父组件:(这次尝试没派上用场,可以忽略)子组件mo-input:(看最后四个键盘事件监听器)methods:{//moveFocus方法监听输入框按下回车键moveFocus(e){console.log(e)constkey={key:'Tab',code:'Tab',keyCode:'9'}conste1=newKeyboardEvent('keydown',key)conste2=newKeyboardEvent('keypress',key)conste3=newKeyboardEvent('keyup',key)e.currentTarget.dispatchEvent(e1)e.currentTarget。dispatchEvent(e2)e.currentTarget.dispatchEvent(e3)},tabClick(e){console.log(e)console.log(e.currentTarget)console.log('tabClick')}}在第一个输入框中按下Press回车键:结果:三个事件发送成功,可以监听成功,但是没有出现Tab键切换焦点的效果。然后,按Tab键:结果:第一个输入框发生keydown事件;在第二个输入框中发生keyup事件。也就是之前的想法是错误的,按下Tab键不会触发三个事件。我不知道如何模拟它。使用另一个感觉更简单的键——字母A键——试试看"//修改moveFocus方法中的key对象constkey={key:'a',code:'KeyA',keyCode:'65'}//修改事件处理函数aClick(e){if(e.key=='a'){console.log(e)console.log(e.currentTarget)console.log('aClick')}}结果:按A正常会发生Keydown、keypress、keyup事件,但是反过来按回车键手动触发这三个事件,不会在输入框中“写入”a,必须在事件处理函数中给e.currentTarget.value赋值OnlyaClick(e){if(e.key=='a'&&e.type=="keyup"){e.currentTarget.value+=e.key}}目前看来这种方式不行。尝试2(成功)找到当前获得焦点的元素和下一个获得焦点的元素,在输入框按下回车键后使用focus()向父组件发送自定义事件;父组件通过ref获取mo-form组件实例,该实例的$el属性中第一个数字键值对为可聚焦元素(可以看到console.dir,console.log打印出DOM结构).父组件:methods:{//moveFocus方法实现焦点切换moveFocus(){constform=this.$refs.formRefconstactive=document.activeElementletflag=trueletkey=0while(flag){if(form.$el[key]==active){flag=falseform.$el[key+1].focus()}else{key++}}}mo-input子组件:methods:{//moveFocus方法监听在输入输入框中按下Enter键moveFocus(){this.$emit('moveFocus')}}