应使用input type="text"配合输入拦截实现mm/yy格式限制,通过input事件实时提取数字、截取前4位、插入斜杠并校验月份(01–12)与年份范围(当前年+15年内),同时手动维护光标位置并统一处理粘贴内容。

信用卡有效期输入框怎么限制只能输 MM/YY 格式
直接用 input type="text" + 输入拦截最可控,type="month" 不适合——它不支持 YY 短年份、无法自定义分隔符、iOS 上显示为年月选择器但年份是完整四位,和卡面 MM/YY 不匹配。
核心思路是:允许用户输入数字和斜杠,实时格式化为 MM/YY,且自动跳过斜杠、阻止非法输入(如月份 >12、年份超范围)。
- 监听
input事件(不是keydown,后者拿不到粘贴内容) - 用正则提取纯数字:
value.replace(/\D/g, '') - 截取前 4 位(最多 MMYY),再按规则插入
/:前 2 位是月,后 2 位是年 - 月份校验必须做:截出的
mm要在01–12之间,否则清空或 fallback 到01
粘贴内容怎么处理才不崩
用户一粘贴 “0325” 或 “03/25” 或 “2025-03”,输入框容易错乱。关键不是禁止粘贴,而是统一归一化。
- 粘贴后立即
event.preventDefault(),自己取clipboardData.getData('text') - 同样走纯数字提取 → 截 4 位 → 格式化逻辑
- 特别注意:如果粘了 “1325”,月份 13 非法,应修正为
"01/25"或清空月份位,不能留"13/25" - 不要依赖
onpaste单独写逻辑——input事件能覆盖粘贴、删除、键盘输入所有情况
怎么让光标不卡在斜杠后面
格式化时直接 input.value = formatted 会导致光标跳到末尾,用户体验极差。必须手动控制光标位置。
- 记录格式化前的
input.selectionStart - 计算格式化后光标应处的位置:比如原输入 “0”,光标在末尾,格式化成 “0”;输入 “01”,变成 “01/”,光标应在
/后;输入 “012”,变成 “01/2”,光标应在 “2” 后 - 用
setSelectionRange()恢复,注意兼容 IE:先focus()再设置 - 简单技巧:只在值实际变化时才重置光标,避免无意义触发
年份校验为什么不能只看两位数字
用户输 “03/23”,这个 “23” 是 2023 还是 2023 年以后?信用卡有效期通常指未来 10–15 年,需结合当前年份动态判断。
- 取当前年份后两位:
new Date().getFullYear() % 100 - 允许的 YY 范围一般是
currentYY到currentYY + 15(含),超出就标红或清空 - 例如现在是 2024 年,用户输 “03/35”,35 → 2035,在范围内;输 “03/15”,15 → 2015,已过期,应提示或拒绝
- 注意:别用
Date.parse("03/25"),它默认转成 2025-03-01,但无法区分 1925 和 2025
真正难的不是格式,是边界逻辑:月份非法时怎么降级、年份模糊时怎么解释、移动端软键盘弹出后光标偏移……这些细节不压测几轮根本发现不了。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











