0

0

如何实现动态创建的OTP输入框自动聚焦切换功能

碧海醫心

碧海醫心

发布时间:2026-01-18 10:51:07

|

586人浏览过

|

来源于php中文网

原创

如何实现动态创建的OTP输入框自动聚焦切换功能

本文详解为何otp输入框的change事件无法触发自动聚焦,以及如何通过input或keyup事件正确实现数字输入后自动跳转到下一个输入框的功能。

在构建六位一次性密码(OTP)输入组件时,一个常见需求是:用户在某个输入框中输入一位数字后,焦点自动移至下一个输入框。然而,若使用 change 事件监听值变化并调用 focus(),往往失效——原因在于 change 事件仅在输入框失去焦点(blur)且值发生改变后才触发,而非实时响应每一次输入。这意味着用户尚未离开当前输入框时,change 根本不会被触发,自然无法执行后续的 focus() 操作。

正确的做法是改用 input 事件(推荐)或 keyup 事件:

  • ✅ input:在 每次变更时立即触发(包括键盘输入、粘贴、拖放等),语义准确、兼容性好(IE9+);
  • ✅ keyup:按键释放时触发,适合需区分按键行为的场景,但不捕获非键盘输入(如粘贴);
  • ❌ change:仅在 blur 后校验变更,不适用于实时跳转逻辑。

以下是修正后的核心代码示例(基于原逻辑优化):

Voiceflow
Voiceflow

Voiceflow 是一个AI驱动的聊天机器人构建平台,可以帮您设计、开发和发布聊天机器人。

下载
const OTP_LENGTH = 6;
const textInputs = [];
const otpContainer = document.getElementById('otp-container');

for (let i = 0; i < OTP_LENGTH; i++) {
  const input = document.createElement('input');
  input.type = 'text'; // 使用 text 而非 number,避免移动端数字键盘限制及浏览器自动验证干扰
  input.maxLength = 1; // 使用原生 maxLength 属性(更可靠)
  input.dataset.otpPos = i;
  input.className = 'otp-input';

  // 实时监听输入
  input.addEventListener('input', function (e) {
    const target = e.target;
    const position = parseInt(target.dataset.otpPos, 10);

    // 清空非数字字符(可选增强)
    target.value = target.value.replace(/[^0-9]/g, '');

    // 输入有效数字后,自动聚焦下一个
    if (target.value && position < OTP_LENGTH - 1) {
      const nextInput = textInputs[position + 1];
      if (nextInput) {
        nextInput.focus();
      }
    }
  });

  // 可选:支持退格键回退(提升体验)
  input.addEventListener('keydown', function (e) {
    if (e.key === 'Backspace' && !this.value && this.previousElementSibling) {
      e.preventDefault();
      this.previousElementSibling.focus();
    }
  });

  textInputs.push(input);
  otpContainer.appendChild(input);
}

// 首个输入框初始聚焦
if (textInputs[0]) textInputs[0].focus();

关键注意事项:

  • 避免为多个输入框设置相同 id="otp-input"(ID 必须唯一),改用 data-* 属性或 class 进行标识;
  • type="number" 在部分移动端可能触发两次输入或阻止粘贴,建议统一用 type="text" 并手动校验数字;
  • 调用 focus() 前请确保目标元素已挂载到 DOM 且可聚焦(本例中因顺序创建,无此问题);
  • 若需支持粘贴多位数字(如用户粘贴 "123456"),可额外监听 paste 事件并分发到各输入框。

通过将事件从 change 切换至 input,即可实现流畅、可靠的 OTP 自动跳转体验,兼顾可用性与健壮性。

相关专题

更多
class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

465

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

13

2025.12.06

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

3053

2024.08.14

点击input框没有光标怎么办
点击input框没有光标怎么办

点击input框没有光标的解决办法:1、确认输入框焦点;2、清除浏览器缓存;3、更新浏览器;4、使用JavaScript;5、检查硬件设备;6、检查输入框属性;7、调试JavaScript代码;8、检查页面其他元素;9、考虑浏览器兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

182

2023.11.24

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

65

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

119

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

32

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

19

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何进行WebSocket调试
如何进行WebSocket调试

共1课时 | 0.1万人学习

TypeScript全面解读课程
TypeScript全面解读课程

共26课时 | 5万人学习

前端工程化(ES6模块化和webpack打包)
前端工程化(ES6模块化和webpack打包)

共24课时 | 5.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号