手机验证码自动跳转下一个输入框之功能

本文介绍了如何实现手机验证码输入时自动跳转到下一个输入框的功能,并在最后一个输入框完成输入后进行数据校验。针对用户体验优化,还添加了删除事件,当用户点击删除时,所有已输入的验证码清空,从头开始输入。

 

业务场景描述:

输入第一个验证码后,自动跳转至后面的输入框中,并且在最后一个输入框输完之后,进行数据校验。

主要代码:



<!-- 六个验证码输入框 -->
<div class="codeinput">
  <input type="tel" maxlength="1" id="tel1"/>
  <input type="tel" maxlength="1"/>
  <input type="tel" maxlength="1"/>
  <input type="tel" maxlength="1"/>
  <input type="tel" maxlength="1"/>
  <input type="tel" maxlength="1" id="tel6"/>
</div>

/* 验证码框样式 */
.codeinput {
    margin:0 auto;
    text-align: center; width: 87.5%; background: #000
}

.codeinput input[type=tel] {
    width: 42px;
    height:42px;
    text-align: center; border:1px solid #dad6da; border-radius: 3px; float: left; margin-left: 1%; font-size: 15px; box-sizing: border-box;
}
/* input 获取焦点边框颜色 */
   
.codeinput input[type=tel]:focus{
    outline:none;
    border:1px solid #5ec2d2;
}
 // 每个输入框只能输入一位 输入完成自动聚焦下一输入框
    // 当输入长度等于6时,输入框失去焦点,自动提交数据,弹出提示框
    $('#tel1').focus(function(){
        //第一个input框获得焦点时触发的事件
        var txts = $(".codeinput input");
        for (var i = 0; i < txts.length; i++) {
            var t = txts[i];
            t.index = i;
            t.setAttribute("readonly", true);
            t.onkeyup = function() {
                this.value = this.value.replace(/^(.).*$/, '$1');
                var next = this.index + 1;
                if (next > txts.length - 1) return;
                txts[next].removeAttribute("readonly");
                if (this.value) {
                    txts[next].focus();
                }
            }
        }
        txts[0].removeAttribute("readonly");
    });
    // 第6个input框键盘弹起事件监听
    $('#tel6').keyup(function(){
        var mobile=$('#mobile').val();//手机号
        var codestr='';//验证码
        var txts = $(".codeinput input");
        for (var i = 0; i < txts.length; i++) {
            codestr+=txts[i].value;
        }
        if(!mobile){
            layer.msg('手机号不能为空!');
            return false;
        }
        if(!/^([1-9])d{10}$/.test(mobile)){
            layer.msg('请输入正确的手机号!');
            return;
        }
        var codestr='';//验证码
        var txts = $(".codeinput input");
        for (var i = 0; i < txts.length; i++) {
            codestr+=txts[i].value;
        }
        if(!codestr){
            layer.msg('验证码不能为空!');
            return;
        }
        if(codestr.length !=6){
            layer.msg('请输入完整6位验证码!');
            return;
        }
        if(!isphonecode){
            layer.msg('验证码不存在!');
            return;
        }
        //TODO:后续请求接口业务逻辑
    });  

这样基本就会实现开篇的效果;但是后来又因为用户不完美的体验,新增可以回退删除事件。后来参考支付宝输入密码的删除事件:将只要用户去点击删除事件,就将输入的所有字符清空,然后从第一个重新开始书写。于是:

$(".codeinput").keydown(function(event){
        if(event.keyCode==8){
            $('.codeinput input[type=tel]').val("");
            $('#tel1').focus();
        }
    });

 

<think>好的,用户想在DevEco Studio中创建一个四位验证码输入界面,每位数字单独输入框,还要实现自动跳转和确认功能。我需要先理清楚需求,然后一步步解决。 首先,四位验证码输入,每个数字一个输入框。通常这种设计需要四个TextInput组件横向排列。每个输入框只能输入一位数字,并且当输入自动跳转到下一个输入框。最后一个输入完成后,可能需要自动触发确认按钮,或者用户手动点击确认按钮。接下来要考虑布局。在DevEcoStudio中,可以使用Flex布局来横向排列四个输入框。每个输入框设置固定宽度,间距适当。确认按钮放在下方。然后是输入控制。每个TextInput需要限制只能输入一个数字,可以通过onChange事件监听输入变化,当输入内容时,自动将焦点转移到下一个输入框。例如,第一个输入框输入完成后,焦点跳到第二个,依此类推。同时,需要处理删除键的情况,如果用户删除,焦点应该回到上一个输入框。关于自动跳转功能,可能需要使用到focusControl方法,或者设置每个输入框的焦点状态。例如,当第一个输入框的text长度达到1时,触发第二个输入框获取焦点。同样,如果用户删除第二个输入框的内容,焦点回到第一个。确认按钮的功能,当四个输入框都填写完毕后,按钮变为可用状态,点击后执行验证逻辑,比如提交验证码跳转页面。这里可能需要使用状态变量来跟踪每个输入框的值,当所有四个值都不为空时,启用按钮。另外,样式方面,每个输入框可能需要设置边框、圆角,以及文本居中显示。确认按钮的背景颜色和样式可以通过XML文件设置,如引用[2]提到的background_button.xml,使用胶囊样式。还需要考虑代码结构,使用ArkTS的组件化方式,将四个TextInput放在一个Flex容器中,确认按钮放在另一个Div中。数据绑定方面,使用@State装饰器来管理每个输入框的值,以及按钮的状态。可能遇到的问题包括焦点控制不顺畅,比如输入后无法正确跳转到下一个输入框,或者删除时焦点没有回退。需要测试各种情况,确保用户体验流畅。此外,输入框的样式可能需要调整,比如边框颜色在获取焦点时变化,提示用户当前输入位置。参考之前的引用,比如引用[3]中的横向滚动布局,虽然这里不需要滚动,但Flex布局的使用可以参考。还有引用[2]中的按钮样式设置,应用到确认按钮上。最后,整合所有功能,编写示例代码,并测试验证每个部分是否正常工作。确保代码符合DevEco Studio的规范,比如使用正确的资源文件和组件属性。</think>在DevEco Studio中创建四位验证码输入界面可通过以下步骤实现: ### 一、布局实现 ```typescript @Entry @Component struct VerifyCodePage { @State code: string[] = ['','','',''] @State isButtonActive: boolean = false build() { Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center }) { // 验证码输入区域 Flex({ justifyContent: FlexAlign.SpaceAround }) { ForEach(this.code, (item, index) => { TextInput({ maxLength: 1, inputFilter: '[0-9]', placeholder: '0' }) .width(80) .height(80) .borderRadius(12) .fontSize(30) .textAlign(TextAlign.Center) .onChange((value) => { this.handleCodeChange(index, value) }) }) } .width('80%') .margin({ top: 50 }) // 确认按钮 Button('确认') .width('60%') .height(50) .margin({ top: 30 }) .backgroundColor(this.isButtonActive ? '#007DFF' : '#CCCCCC') .backgroundImage($r('app.media.background_button')) .onClick(() => { this.submitCode() }) } .width('100%') .height('100%') } } ``` ### 二、核心功能实现 1. **自动跳转逻辑**: ```typescript private handleCodeChange(index: number, value: string) { this.code[index] = value // 自动跳转逻辑 if (value.length === 1 && index < 3) { focusControl.requestFocus(index + 1) } // 检查按钮状态 this.isButtonActive = this.code.every(item => item !== '') } ``` 2. **焦点控制**: ```typescript const focusControl = new FocusController() ``` 3. **提交验证逻辑**: ```typescript private submitCode() { if (this.isButtonActive) { // 执行页面跳转逻辑 router.replaceUrl({ url: 'pages/ConfirmPage' }) } } ``` ### 三、样式优化 1. 创建`resources/base/graphic/background_button.xml`: ```xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:ohos="http://schemas.huawei.com/res/ohos" ohos:shape="rectangle"> <corners ohos:radius="100"/> <solid ohos:color="#007DFF"/> </shape> ``` 2. 添加CSS样式: ```css .text-input { border: 2vp solid #007DFF; background-color: #FFFFFF; } .text-input:focus { border-color: #FF8000; } ``` ### 四、功能特点 1. **输入验证**:通过`inputFilter`限制只能输入数字 2. **自动跳转**:当输入完成时自动切换焦点[^2] 3. **状态反馈**:按钮颜色随输入状态变化 4. **错误处理**:自动回退焦点到前一个输入框 5. **跨设备适配**:使用vp单位保证布局响应式
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值