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

【前端】输入框输入内容时,根据文本长度自动分割,中间用横杠分割

目录

一、需求

二、效果图

三、示例

 1、HTML结构

2、CSS样式

3、jq实现

4、获取输入框的值

四、拓展,文本自动填充


一、需求

有4个输入框,每个输入框限制5个字符,根据文本长度字段分割,每个输入框中间用横杠分割,如gWphJ-BCuoe-AdYEH-WhHUa-P0jF1

要求:

① 输入满后自动跳转到下一个输入框中;

② 支持粘贴,支持粘贴带横杠的字符串(如:gWphJ-BCuoe-AdYEH-WhHUa-P0jF1),也支持粘贴不带横杠的字符串(自动按每5个字符分割);

③ 退格处理,当在空输入框按退格键时,跳转到上一个输入框。

二、效果图

支持手动输入,也支持粘贴输入

三、示例

 1、HTML结构

<div class="code-input-container"><input type="text" maxlength="5" class="code-input" data-index="1"><span class="separator">-</span><input type="text" maxlength="5" class="code-input" data-index="2"><span class="separator">-</span><input type="text" maxlength="5" class="code-input" data-index="3"><span class="separator">-</span><input type="text" maxlength="5" class="code-input" data-index="4">
</div>

2、CSS样式

.code-input-container {display: flex;align-items: center;justify-content: center;gap: 5px;
}.code-input {width: 80px;height: 40px;text-align: center;font-size: 16px;border: 1px solid #ccc;border-radius: 4px;
}.separator {font-size: 20px;font-weight: bold;color: #666;
}

3、jq实现

// 输入5位字符时,使用横行分割,光标自动定位	
document.addEventListener('DOMContentLoaded', function() {const inputs = document.querySelectorAll('.code-input');// 自动跳转逻辑inputs.forEach(input => {input.addEventListener('input', function(e) {const index = parseInt(this.dataset.index);// 如果输入满5个字符,跳转到下一个输入框if (this.value.length === 5 && index < inputs.length) {inputs[index].focus();}});// 处理退格键input.addEventListener('keydown', function(e) {const index = parseInt(this.dataset.index);// 如果当前输入框为空且按下退格键,跳转到上一个输入框if (e.key === 'Backspace' && this.value.length === 0 && index > 1) {e.preventDefault();inputs[index - 2].focus();}});});// 粘贴处理(自动分割粘贴的内容)inputs[0].addEventListener('paste', function(e) {e.preventDefault();const pasteData = e.clipboardData.getData('text').trim();// 如果粘贴内容包含横杠,按横杠分割if (pasteData.includes('-')) {const parts = pasteData.split('-');parts.forEach((part, i) => {if (i < inputs.length) {inputs[i].value = part.substring(0, 5);}});} // 否则按每5个字符分割else {for (let i = 0; i < inputs.length; i++) {const start = i * 5;inputs[i].value = pasteData.substring(start, start + 5);}}// 聚焦到最后一个有内容的输入框let lastFilledIndex = 0;for (let i = 0; i < inputs.length; i++) {if (inputs[i].value.length > 0) {lastFilledIndex = i;}}inputs[lastFilledIndex].focus();});
});

4、获取输入框的值

// 获取每个输入框的值
function getFullCode() {const inputs = document.querySelectorAll('.code-input');const codeParts = Array.from(inputs).map(input => input.value);// 验证每个部分的长度是否为5const isValid = codeParts.every(part => part.length === 5);if (!isValid) {// 高亮显示不符合要求的输入框inputs.forEach(input => {if (input.value.length !== 5) {input.style.borderColor = 'red';input.style.backgroundColor = '#fff0f0';} else {input.style.borderColor = '';input.style.backgroundColor = '';}});// 返回错误信息return {success: false,message: '邀请码不完整',code: null};}// 返回成功结果return {success: true,message: '验证通过',code: codeParts.join('-')};
}///// 使用示例 ////////////
const result = getFullCode();if (result.success) {console.log('完整代码:', result.code);// 提交表单或进行下一步操作
} else {console.error('错误:', result.message);// 显示错误提示给用户alert(result.message);
}

四、拓展,文本自动填充

如果URL为“http://xxx.xx?visit_code=qtc3Z-lNIr4-fbGbr-HqUdG”,从URL参数中获取visit_code,并自动填充到输入框中。

// 自动填充邀请码到输入框
function autoFillInviteCode(fullCode) {// 清除所有输入框的当前内容和错误样式const inputs = document.querySelectorAll('.code-input');inputs.forEach(input => {input.value = '';input.style.borderColor = '';input.style.backgroundColor = '';});// 移除所有横杠,只保留字母数字const cleanCode = fullCode.replace(/-/g, '');// 检查总长度是否为25个字符(5部分×5字符)if (cleanCode.length !== 20) {alert('邀请码格式不正确,应为20个字符');return false;}// 分割并填充到各个输入框for (let i = 0; i < 4; i++) {const startPos = i * 5;inputs[i].value = cleanCode.substring(startPos, startPos + 5);}return true;
}// 获取邀请码并自动填充
document.addEventListener('DOMContentLoaded', function() {// 从URL参数获取邀请码(假设参数名为visit_code)const urlParams = new URLSearchParams(window.location.search);const inviteCode = urlParams.get('visit_code');if (inviteCode) {autoFillInviteCode(inviteCode);alert('邀请码已自动填充');}});
http://www.xdnf.cn/news/15615.html

相关文章:

  • 模版匹配的曲线好看与否有影响吗?
  • Git 中如何比较不同版本之间的差异?常用命令有哪些?
  • 金属伪影校正的双域联合深度学习框架复现
  • Prometheus错误率监控与告警实战:如何自定义规则精准预警服务器异常
  • Spring Boot 应用优雅停机与资源清理:深入理解关闭钩子
  • SQLite 数据库字段类型-详细说明,数据类型详细说明。
  • ES v.s Milvus v.s PG
  • kafka 单机部署指南(KRaft 版本)
  • 代码训练营DAY35 第九章 动态规划part03
  • cocosCreator2.4 Android 输入法遮挡
  • 车载监控录像系统:智能安全驾驶的守护者
  • AI编程工具 Cursor 和 Kiro 哪个的Claude更好用!
  • 如何使用Python将HTML格式的文本转换为Markdown格式?
  • Java基础篇
  • Altera Quartus:编译完成后自动生成pof文件
  • 20250718-6-Kubernetes 调度-Pod对象:环境变量,初始容器,静态_笔记
  • VR平台应该具备哪些功能?怎样选择VR平台?
  • 【playwright篇】教程(十六)[macOS+playwright相关问题]
  • 填坑 | React Context原理
  • AndroidX中ComponentActivity与原生 Activity 的区别
  • STM32+w5500+TcpClient学习笔记
  • JAVA中StringBuilder类,StringJoiner类构造函数方法简单介绍
  • [2025CVPR-目标检测方向] CorrBEV:多视图3D物体检测
  • 基于 HT 的 3D 可视化智慧矿山开发实现
  • 短视频矩阵系统哪家好?全面解析与推荐
  • 无人机传感器模组运行与技术难点分析
  • 嵌入式数据结构之顺序表总结
  • 自学力扣:最长连续序列
  • 小结:Spring MVC 的 XML 的经典配置方式
  • 【每日算法】专题十三_队列 + 宽搜(bfs)