lay-verify 默认不支持多选框“至少选两项”校验,需通过 form.verify() 自定义 atleasttwo 规则,统计同 name 的已选项数量实现。

lay-verify 默认不支持多选框“至少选两项”的校验
因为 lay-verify="required" 对 <input type="checkbox"> 只判断「是否至少选了一个」,无法表达「最少两个」的语义。Layui 的内置验证规则里没有 minchecked 或类似字段,必须手动扩展。
用自定义验证规则 + name 相同的 checkbox 组实现
关键前提是:所有待校验的多选框必须有相同的 name 属性(如 name="hobby"),且不能加 lay-verify="required" 到单个 input 上,而是绑定到父容器(如 <div class="layui-form-item">)或任意一个 checkbox 上,再通过 <code>form.verify() 注册逻辑。
- 在表单初始化前调用
form.verify(),注册新规则,例如:form.verify({ atLeastTwo: function(value, item){ // value 是第一个被触发的 checkbox 的 value,实际不用它 var checked = $('input[name="hobby"]:checked').length; if(checked - 给任一 checkbox 或其父
<div> 添加 <code>lay-verify="atLeastTwo" - 确保 jQuery 已加载(Layui 1.x 依赖 jQuery,2.x 不依赖但此方案仍需 jQuery 来查选中数);若用 Layui 2.x,改用原生写法:
document.querySelectorAll('input[name="hobby"]:checked').length - 推荐统一用无符号 name,如
name="hobby",后端接收时按数组处理(PHP 自动转为数组,Node.js 需解析) - 如果必须用
hobby[],验证函数内务必对 name 做双反斜杠转义 - 不要把验证规则绑在
<label></label>或<span></span>上——lay-verify只在<input>、<select></select>、<textarea></textarea>和它们的直接父<div class="layui-form-item"> 上生效 <h3>提交时动态校验比依赖 lay-verify 更可靠</h3> <p>当多选框跨区域、或部分由 JS 动态增删时,<code>lay-verify触发时机可能滞后(比如只在校验当前 input change 时执行)。更稳的做法是:移除lay-verify,在form.on('submit')回调里手动检查:form.on('submit(myform)', function(data){ var checked = $('input[name="hobby"]:checked').length; if(checked <p>这个方式绕过 Layui 校验链,完全可控,也避免了 name 转义、事件绑定位置等隐性约束。</p> <p>真正麻烦的不是写几行 JS,而是默认以为 <code>lay-verify</code> 能覆盖所有业务场景——它只覆盖常见模式,复杂约束得自己托底。</p>
注意 name 值和 DOM 查询范围的一致性
常见翻车点:后端接收数组时习惯写 name="hobby[]",但 jQuery 选择器中 [] 是特殊字符,必须转义——$('input[name="hobby\[\]"]:checked'),否则查不到任何元素。











