设置正则仅允许字母空格却不校验小键盘输入,表单校验失效怎么办
校验未生效的核心原因
- 你使用
keydown事件的ev.which属性结合String.fromCharCode()获取输入字符的逻辑存在本质错误:ev.which返回的是键盘按键的物理编码,而非实际输入字符的ASCII码。- 小键盘数字的按键编码范围是96~105,
String.fromCharCode(96)到String.fromCharCode(105)返回的是`、a、b、c……i这些字符,刚好命中姓名输入框的字母校验规则,导致小键盘数字被放行。 - 输入组合键生成的特殊字符时(比如按Shift+2输入@),
ev.which返回的是主键盘数字2的编码50,String.fromCharCode(50)返回字符2,刚好命中手机号输入框的数字校验规则,导致特殊字符被放行。
- 小键盘数字的按键编码范围是96~105,
- 现有逻辑只能拦截键盘输入行为,无法处理粘贴、拖拽输入等场景,存在校验漏洞。
- 长度校验逻辑读取的是按键触发前的输入框值,会存在1位的判断误差。
修复方案
建议放弃按键拦截的思路,改用input事件直接对输入框的最终值做过滤替换,兼容性更强,逻辑更简单:
let namecheck = false; let mobcheck = false; // 姓名输入框校验 $("#fname").on('input', function () { // 替换所有非字母、空格的字符,同时清理连续空格 this.value = this.value.replace(/[^A-Za-z ]/g, '').replace(/\s+/g, ' '); // 长度校验 if (this.value.trim().length < 3) { namecheck = false; $("#error1").text("Enter at least 3 characters"); } else { $("#error1").text(""); namecheck = true; } }); // 手机号输入框校验 $("#fmob").on('input', function () { // 替换所有非数字字符,同时限制最长10位 this.value = this.value.replace(/[^0-9]/g, '').slice(0,10); // 长度校验 if (this.value.length < 10) { mobcheck = false; $("#error2").text("Mobile number should be at least 10 digits"); } else { $("#error2").text(""); mobcheck = true; } });
内容的提问来源于stack exchange,提问作者anand s
相关产品推荐
相关产品推荐

