实现多文本框输入内容合并至用户名/密码输入框的问题
解决方案:合并多输入框内容同步到用户名和密码框
修正后的完整代码
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.3.1/dist/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <style> .flex{ display: flex; } .otSc { margin: 0; margin-right: 16px; border: 1px solid; border-radius: 8px; padding: 1px 0px; font-size: 15px; text-align: center; width: 100%; outline: none; } .otSc:last-child{ margin-right: 0; } .otpCont { padding: 10px 10px; } </style> <div class="col-md-3"> <div class="otpCont flex spaceBetween"> <input class="otSc" type="text" maxlength="1"> <input class="otSc form-control" type="text" maxlength="1"> <input class="otSc form-control" type="text" maxlength="1"> <input class="otSc form-control" type="text" maxlength="1"> <input class="otSc form-control" type="text" maxlength="1"> <input class="otSc form-control" type="text" maxlength="1"> </div> <p>顶部输入的内容应合并后显示在底部</p> <div class="col-md-6 m-b-15" > <input id="usernameInput" type="text" class="form-control" name="username" placeholder="合并后的用户输入"/> </div> <div class="col-md-6 m-b-15" > <input id="passwordInput" type="text" class="form-control" name="password" placeholder="合并后的密码输入"/> </div> </div> <script type="text/javascript"> // 合并OTP输入框内容并同步到用户名和密码框 function mergeOtpAndSync() { let mergedValue = ''; document.querySelectorAll('.otSc').forEach(input => { mergedValue += input.value || ''; }); // 同步到两个输入框 document.getElementById('usernameInput').value = mergedValue; document.getElementById('passwordInput').value = mergedValue; } // 为所有OTP输入框绑定输入事件(覆盖键盘输入、粘贴等场景) document.querySelectorAll('.otSc').forEach(function(otpEl) { otpEl.addEventListener('input', mergeOtpAndSync); otpEl.addEventListener("keyup", backSp); otpEl.addEventListener("keypress", function(e) { // 仅当输入有效字符时跳转到下一个输入框 if (/^[0-9a-zA-Z]$/.test(e.key)) { const nexEl = this.nextElementSibling; if (nexEl) nexEl.focus(); } }) }) function backSp(backKey) { if (backKey.keyCode === 8 && !this.value) { // 仅当当前输入框为空时,退格键才跳转到上一个输入框 const prev = this.previousElementSibling; if (prev) prev.focus(); } } </script>
关键修改说明
- 修正ID重复问题:原代码中用户名和密码框使用了相同的
id="maxVoucherCode",违反DOM唯一性规则,已分别改为usernameInput和passwordInput。 - 新增合并同步函数:
mergeOtpAndSync函数遍历所有.otSc输入框,拼接所有输入值后,同步设置到用户名和密码框。 - 完善输入事件监听:使用
input事件替代单一的keyup,覆盖键盘输入、鼠标粘贴等所有内容变更场景,确保合并值实时更新。 - 优化焦点跳转逻辑:
- 仅在输入有效单字符时,才跳转到下一个输入框
- 仅在当前输入框为空时,退格键才跳转到上一个输入框,避免无效焦点切换
内容的提问来源于stack exchange,提问作者Penwell
相关产品推荐
相关产品推荐

