必须在submit事件中用javascript调用完整算法校验并后端复现,因为pattern仅做正则初筛,无法验证校验码、非法日期、无效地区码,且用户可禁用js或绕过前端。

不能只靠 pattern 提交时校验,必须用 JavaScript 在 submit 事件中调用完整算法函数,且后端必须复现同一套逻辑。
为什么 pattern 在表单提交时根本拦不住错误身份证
pattern 只做正则格式初筛,比如 [0-9]{17}[0-9Xx] 能挡掉 123abc...,但对以下情况完全失效:
- 前17位数字加权求和后,第18位校验码算错(如应为
X却填了0) - 出生日期非法(如
20230230,2月没有30日) - 地区码不存在(如开头
999) - 用户禁用 JS 或直接 POST 绕过前端
浏览器触发 submit 时,pattern 校验早已在输入阶段完成;它不参与“提交前最终判定”,更不会执行加权 + mod11 运算。
submit 事件里必须调用完整 JS 校验函数
在 form.addEventListener('submit', ...) 中手动运行校验逻辑,失败时调用 event.preventDefault() 阻止提交:
- 先用正则快速过滤明显非法长度或字符:
/^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/ - 再取前17位,用加权因子
[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]逐位相乘求和 - 对11取模,查表
['1','0','X','9','8','7','6','5','4','3','2']得理论校验码 - 比对时必须转大写:
id[17].toUpperCase() === checkCode[sum % 11].toUpperCase()
示例关键片段:
form.addEventListener('submit', function(event) {
const id = document.getElementById('idNumber').value.trim();
if (!validateIdCard(id)) {
event.preventDefault();
alert('身份证号不合法,请检查');
}
});
后端必须用相同算法重跑一遍
前端任何校验都可被绕过,服务端必须独立实现完全一致的逻辑:
- Node.js:在 Express 中间件里复用同一段 JS 函数(注意用
parseInt()转数字,避免字符串隐式转换) - Python:用
re.match()做初筛,再手动循环计算加权和,不可依赖第三方库黑盒 - Java:注意
char转int要减'0',末位X需单独转为 10 处理
前后端校验码表、加权因子、日期范围规则必须一字不差——哪怕一个因子写成 7 和 07 都会导致不一致。
最容易被忽略的是:日期部分的正则看似能筛掉 13 月,但无法识别 20240230 这种闰年错日;真正可靠的日期合法性,得靠 new Date() 或后端日期解析函数兜底。别让正则给你假安全感。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











