layui radio 的 change 事件必须用 form.on('radio(filter)') 绑定,因原生 input 被隐藏;需手动处理初始化显隐、同步清理 lay-verify、操作 .layui-form-item 容器而非子元素,并在显示后重新渲染依赖组件。

layui radio 的 change 事件必须用 form.on('radio(filter)', ...) 绑定
直接监听原生 click 或读取 checked 属性会失效,因为 layui 把原生 input[type="radio"] 隐藏了,只暴露伪元素。你看到的“单选框”其实是 span.layui-form-radio,它不响应原生事件。
正确写法是:
form.on('radio(boxNume)', function(data) {
if (data.value === '1') {
$('#boxN').show();
} else {
$('#boxN').hide();
}
});
-
boxNume必须和 HTML 中lay-filter="boxNume"的值完全一致 -
data.value是字符串,不是数字,别写成data.value === 1 - 页面初始化时没触发事件,所以首次显示/隐藏要手动补一次:
$('#boxN').toggle($('input[name="boxNume"]:checked').val() === '1');
隐藏后表单元素仍参与校验,必须同步清理 lay-verify
单纯 .hide() 不影响 form.val() 和 form.verify(),如果被隐藏的 div 里有带 lay-verify="required" 的输入框,提交时必然报错。
安全做法是:
- 隐藏前清空值:
layui.$('#boxNume_s, #boxNume_e').val('').attr('lay-verify', '') - 显示时恢复校验:
layui.$('#boxNume_s').attr('lay-verify', 'required')(按实际规则还原) - 最后调
form.render(),否则新显示的控件无法被验证模块识别
避免用 .hide() 直接操作 layui-form-item
对 .layui-form-item 调 .hide() 后,后续调 form.render()(比如动态增删字段)可能让它突然“弹出来”或高度异常,因为 layui 渲染逻辑依赖节点可见性计算。
推荐替代方案:
- 加 layui 自带的
layui-hide类:$('#boxN').closest('.layui-form-item').addClass('layui-hide') - 或设内联样式:
css({'height': '0', 'padding': '0', 'border': '0', 'overflow': 'hidden'}) - 不要只 hide
div里的某个input,得操作整个.layui-form-item容器
多个 radio 共享 name 时,初始状态容易漏判断
页面加载时,如果没显式设置 checked,$('input[name="boxNume"]:checked') 可能返回空,导致初始隐藏逻辑不执行。
稳妥做法:
- HTML 中确保有一个
checked(哪怕默认选第一个) - JS 初始化时主动触发一次:
form.render('radio')确保渲染完成,再读取当前值 - 或者把显隐逻辑封装成函数,在
form.on里调,也在 DOM ready 时手动调一次
最易被忽略的是:隐藏区域里如果有 select、laydate、layedit 这类需要手动初始化的组件,显示后不调 form.render('select') 或 laydate.render(),它们就只是静态 HTML,点不动。


















