form.on('radio(filter)')是唯一可靠监听方式,因Layui渲染后替换原生DOM,直接绑定onclick会失效;必须共用name属性和相同lay-filter值,且在DOM插入后调用或重渲染。
form.on('radio(filter)') 是唯一可靠监听方式
直接给 <input type="radio"> 绑 onclick 会失效——layui 渲染后替换了原生 dom,你点的其实是它生成的伪元素(.layui-form-radio)。必须用 form.on() 配合 lay-filter 才能捕获真实点击行为。
关键前提:所有同组 radio 必须共用 name 属性,且每个都带相同的 lay-filter="xxx" 值。比如:
<input type="radio" name="status" lay-filter="statusFilter" value="1" title="启用"><input type="radio" name="status" lay-filter="statusFilter" value="2" title="禁用">
对应 JS 中必须先加载 form 模块,再监听:
layui.use(['form'], function(){
var form = layui.form;
form.on('radio(statusFilter)', function(data){
console.log(data.value); // 点击项的 value 值
});
});
<h3>监听回调里的 data.value 和 data.elem 区别</h3>
<p><code>data.value</code> 是最常用字段,返回当前被选中 radio 的 <code>value</code> 字符串,无需额外取值;<code>data.elem</code> 是原始 <code><input></code> DOM 节点,但注意它已被 Layui “禁用”交互,不能直接调用 <code>.click()</code> 或改 <code>checked</code>。</p>
- 想读取当前选中值 → 直接用
data.value - 想操作关联 DOM(如显示/隐藏某区块)→ 用
data.value判断后,用 jQuery 或原生document.querySelector找目标元素 - 想动态触发选中 → 不要用
data.elem.click(),应调用$('input[name="xxx"][value="yyy"]').prop('checked', true).next('.layui-form-radio').click()
动态渲染或异步加载 radio 后事件不生效?
常见于 AJAX 加载表单、Vue/React 嵌入 Layui 表单等场景。此时 form.on() 绑定早于 DOM 渲染,监听器根本没挂上。
解决方法只有两个:
- 确保
form.on()在 radio 元素插入 DOM 之后再执行(比如放在 AJAXsuccess回调末尾) - 如果无法控制时机,就强制重渲染:
form.render('radio', 'filter值'),第二个参数是可选的容器 filter,用于局部刷新 - 避免在
layui.use()外提前调用form.on(),模块未加载完成时该方法不存在
移动端 click 事件能替代 form.on 吗?
不能。微信端或 H5 页面里,即使你给 radio 写了 onclick="handle()",Layui 的渲染逻辑仍会覆盖原生事件绑定。而且移动端存在 300ms 延迟和点击穿透风险,反而更不可靠。
正确做法仍是统一走 form.on('radio(xxx)')。只要确保引入的是完整版 layui.js(不是精简的 layer.js),该 API 在移动端完全可用。
真正容易被忽略的是:Layui 的 radio 事件只在“状态切换”时触发,即从无选中 → 选中某一项,或从选中 A → 选中 B。如果用户反复点击同一个已选项,form.on 不会再次执行——这不是 bug,是设计使然。











