layui监听radio必须用form.on('radio(filter)'),filter值需与lay-filter严格一致;动态表单需调用form.render();显隐操作应基于data.value并手动初始化默认状态。
form.on('radio()') 是唯一可靠监听方式
直接给 <input type="radio"> 绑定原生 click 事件会失效,因为 layui 在渲染时接管了 radio 的 dom 结构(替换成 <div class="layui-radio"> 等),原生事件无法触发。必须用 layui 表单模块的监听语法。
关键点:lay-filter 属性值必须和 form.on('radio(XXX)') 中的 XXX 完全一致,大小写、空格都不能错。
- 错误写法:
<input name="type" value="1" lay-filter="Type">+form.on('radio(type)', ...) - 正确写法:
<input name="type" value="1" lay-filter="type">+form.on('radio(type)', ...) - 如果表单是动态插入的(比如弹窗中),需确保
layui.use(['form'], ...)在插入后执行,或调用form.render()主动初始化
显示/隐藏目标元素要选对作用域
layui 不会自动帮你找关联的 input 或 div,得自己用 jQuery 或原生 JS 定位。常见错误是用错选择器导致找不到元素,或者隐藏后没重绘表单样式。
推荐用 class 或 id 显式标记目标区域,避免依赖 DOM 层级(层级一变就失效):
- 给要控制的
<div class="layui-form-item">加一个明确 class,如class="layui-form-item count-field" - 在回调里用
$('.count-field').show()/.hide(),而不是靠父级.next()或.siblings() - 隐藏后务必调用
form.render(),否则被隐藏的<input>可能仍参与表单校验,或样式残留(比如 label 还显示着)
data.value 比手动查 checked 更安全
form.on('radio(...) 回调参数 data 里有 data.value,它直接返回当前被选中的 radio 的 value 值,比用 $('input[name="x"]:checked').val() 更可靠。
原因:当多个同名 radio 分布在不同 form 或动态增删时,:checked 可能匹配到非预期项;而 data.value 是 layui 在触发事件时精确捕获的值,不依赖 DOM 查询上下文。
- 正确:
if (data.value === '试用') { $('.count-field').show(); } - 不推荐:
if ($('input[name="t"]:checked').val() === '试用') { ... } - 注意:
data.value是字符串,即使 HTML 中写value="1",它也是"1",别用=== 1做全等判断
初始状态容易被忽略
页面加载时,如果某个 radio 默认选中,但对应 input 未同步显示/隐藏,说明没做初始化逻辑。layui 不会自动触发一次 radio 事件来模拟“默认选中”。
必须手动补上:
- 在
form.on('radio(...)')外,加一段初始化代码,读取当前选中值并执行对应显隐 - 例如:
var initVal = $('input[name="type"]:checked').val(); if (initVal === 'APP') { $('#app_url').show(); $('#pc_url').hide(); } else { ... } - 更稳妥的做法是把显隐逻辑抽成函数,在
form.on和初始化时都调用一次,避免重复
这个初始化步骤漏掉,上线后常表现为“第一次点没反应”或“默认状态错乱”,但开发者本地测试时可能恰好默认选中了正确项,反而测不出来。


















