layui原生无identity验证类型,需手动注册;应覆盖15/18位格式并严格校验末位(x大写、按gb11643-1999计算),仅长度数字匹配不充分。

layui 中用 lay-verify="identity" 会失效,为什么?
因为 layui 原生验证规则里压根没有 identity 这个内置类型。你写上它不会报错,但也不会触发任何校验逻辑——表单照样能提交,身份证号格式错误也拦不住。
正确做法:自定义验证规则 + 正则判断
必须手动注册一个叫 identity 的验证类型,并提供校验函数。注意正则要覆盖 15 位老格式和 18 位新格式,还要校验末位校验码(不能只靠长度和数字)。
常见错误是只检查长度和数字,比如 /^\d{15}|\d{17}[\dXx]$/ —— 这种写法漏掉校验码逻辑,18 位中第 17 位必须是数字、第 18 位可以是数字或 X,且需按国标 GB11643-1999 计算校验位。
实操建议:
- 在
layui.use(['form'], ...)回调内调用form.verify()注册规则 - 校验函数返回
false表示失败,返回字符串表示错误提示 - 15 位不校验码,但需全数字;18 位必须校验最后一位,
X必须大写 - 别忘了把 input 的
lay-verify属性设为"identity"
form.verify({
identity: function(value) {
const v = value.trim();
if (!v) return '请输入身份证号';
if (/^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/.test(v)) {
// 粗筛通过,再校验 18 位的最后一位
if (v.length === 18) {
const arr = v.toUpperCase().split('');
const wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
const y = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
let sum = 0;
for (let i = 0; i <h3>input 标签里怎么写才生效?</h3><p>除了注册规则,HTML 层也要配对。重点看三个地方:</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/code/7535" title="深蓝色网站后台管理系统layui框架模板-AdminPro"><img
src="https://img.php.cn/upload/webcode/000/287/557/6340dac18f876183.png" alt="深蓝色网站后台管理系统layui框架模板-AdminPro" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/code/7535" title="深蓝色网站后台管理系统layui框架模板-AdminPro" class="overflowclass">深蓝色网站后台管理系统layui框架模板-AdminPro</a>
<p class="overflowclass">一款深蓝色网站后台管理系统layui框架模板</p>
</div>
<a rel="nofollow" href="/xiazai/code/7535" title="深蓝色网站后台管理系统layui框架模板-AdminPro" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
-
lay-verify必须是注册时用的名字,比如lay-verify="identity" -
name属性不能为空,否则 layui 表单提交时可能忽略该字段 - 如果用了
required,建议删掉,避免浏览器原生验证和 layui 冲突导致提示混乱
示例写法:
<input type="text" name="idcard" lay-verify="identity" placeholder="请输入身份证号" class="layui-input">
移动端输入时容易被忽略的问题
安卓微信内置浏览器、部分国产浏览器会把身份证号自动识别为“数字”,弹出纯数字键盘,导致用户无法输入 X。这不是验证逻辑问题,但会导致用户卡在输入环节。
解决方法只有两个:
- 加
inputmode="text"强制调出全键盘(兼容性较好,现代浏览器都支持) - 或者改用
type="text"并配合pattern="[0-9Xx]{15,18}"(仅作辅助,不能替代 JS 校验)
真正起作用的还是前面注册的 identity 规则——只要用户输进去了,无论怎么输,校验逻辑都在。
验证逻辑本身不难,难的是把正则、校验码计算、DOM 属性、浏览器兼容这四块严丝合缝地串起来。漏掉任意一环,都会出现“看着写了却没效果”的情况。










