You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

设置正则仅允许字母空格却不校验小键盘输入,表单校验失效怎么办

校验未生效的核心原因

  • 你使用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,刚好命中手机号输入框的数字校验规则,导致特殊字符被放行。
  • 现有逻辑只能拦截键盘输入行为,无法处理粘贴、拖拽输入等场景,存在校验漏洞。
  • 长度校验逻辑读取的是按键触发前的输入框值,会存在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:18:02