应使用自定义校验函数contractNo,在form.verify中判断复选框是否勾选并校验输入值,同时用form.on('checkbox(agreeContract)')监听状态变化并手动清除提示,禁用required属性切换无效。

复选框勾选后才触发必填校验
Layui 表单的必填规则(required)默认是静态绑定在 lay-verify="required" 上的,不会随 DOM 状态自动更新。想让某个输入框“仅当复选框被勾选时才必须填写”,不能只靠 HTML 属性,得手动干预校验逻辑。
核心思路是:移除该输入框的 lay-verify="required",改用自定义校验函数,在函数里判断复选框状态。
- 给复选框加
id="agreeContract"(或其他唯一标识) - 给目标输入框加
lay-verify="contractNo"(自定义规则名) - 在
form.verify中注册contractNo函数,内部读取$("#agreeContract").is(":checked") - 校验函数返回
false或字符串表示失败,返回undefined或true表示通过
form.verify 中怎么写动态校验函数
必须在 layui.use(['form'], ...) 回调内注册,且不能用箭头函数(避免 this 指向异常)。函数接收两个参数:value(当前输入值)、item(DOM 元素),可从中取 name 或其他属性辅助判断。
form.verify({
contractNo: function(value, item){
// 只有勾选了复选框,才校验非空
if ($('#agreeContract').is(':checked') && !value.trim()) {
return '合同编号不能为空';
}
// 其他情况(未勾选 or 有值)都放行
}
});
注意:这里没写 return true,因为 Layui 校验函数默认返回 undefined 即视为通过,显式写 true 也行,但没必要。
复选框状态变化时要不要重置校验提示
要。否则用户先勾选、输错、看到红提示;再取消勾选,提示还挂着,体验差。得监听复选框 change,并调用 form.val() 或 form.render() 配合手动清除提示。
- 用
form.on('checkbox(agreeContract)', ...)监听更稳妥(比原生change兼容 Layui 渲染后的复选框) - 勾选取消时,调用
form.validate('contractNo')不起作用,得手动清提示:$(item).siblings('.layui-form-danger').removeClass('layui-form-danger'); - 更简单做法:直接调用
form.reset()重置整个表单(如果允许清空其他字段) - 推荐方案:在 checkbox 监听里,对目标输入框执行
$(inputEl).siblings('.layui-form-danger').removeClass('layui-form-danger');
为什么不用 disabled + required 切换
有人想用 JS 动态加/删 required 属性或设 disabled,这不行。Layui 的表单校验不响应 DOM 属性变更,required 属性只在初始化时读取一次;disabled 字段会被 form.val() 忽略,且禁用后用户无法输入,不符合“可填可不填”的交互意图。
真正需要的是语义上的条件校验,不是 DOM 控制。自定义 verify 是唯一可靠路径。别绕弯子试 setAttribute('required', '') 或 form.render(),浪费时间。
最易忽略的是 checkbox 监听必须用 form.on('checkbox(filter)') 而不是原生事件——Layui 复选框点击后 DOM 并没立刻变,得等它的内部事件冒泡完成,否则 is(':checked') 拿到的是旧状态。











