必须使用 form.on('radio(filter)') 监听 layui 渲染的 radio,因原生事件失效;同组 radio 需共用 name 和相同 lay-filter;ajax 动态加载后需确保 dom 存在再绑定或调用 form.render();table 行内 radio 应用 table.on('radio(filter)') 而非 form.on。

必须用 form.on('radio(filter)'),原生 onclick 或 change 会失效
Layui 渲染 radio 后,原始 <input type="radio"> 被隐藏并替换为伪元素(如 .layui-form-radio),你点的不是原生 input,所以直接绑定 onclick、onchange 或 jQuery 的 .click() 全部无效。
- 唯一可靠方式是通过
form.on('radio(filter)'),其中filter是你在 HTML 中写的lay-filter值 - 所有同组 radio 必须共用
name属性,且每个都带相同lay-filter="xxx" -
layui.use(['form'], ...)必须在 DOM 插入之后执行,否则form.on()不生效
data.value 就是你要的值,别再去读 data.elem.checked
data.value 是字符串类型,直接返回被点击项的 value 属性值,不需要额外取值或判断;而 data.elem 是原始 input DOM 节点,但已被 Layui 禁用交互——调用 data.elem.click() 或手动设 checked = true 都不会触发 UI 更新。
- 想响应选中逻辑 → 直接用
data.value判断分支 - 想联动显示/隐藏区块 → 用
data.value做条件,再用document.querySelector或 jQuery 找目标元素操作 - 想程序触发选中 → 不要用
data.elem,应改原生 input 的checked属性 + 调用form.render('radio', 'filter')
AJAX 动态加载后事件不触发?先确认是否漏了 form.render()
常见于表格行内嵌 radio、弹窗表单异步加载等场景:DOM 是后来插入的,但 form.on() 绑定发生在页面初始化时,监听器根本没挂上。
- 最稳妥做法:把
form.on()放到 AJAX 成功回调末尾,确保 DOM 已存在 - 如果无法控制时机(比如第三方组件注入),就强制局部重渲染:
form.render('radio', 'yourFilterName') - 绝对不要在
layui.use()外提前调用form.on(),模块未加载完成时该方法不存在,会报form is not defined
表格 table 里的行单选框,监听方式完全不同
如果你是在 table.render() 的列中配置了 type: 'radio',那它走的是 table 模块事件,不是 form 模块——监听写成 form.on('radio(xxx)') 完全无效。
- 正确写法是:
table.on('radio(test)', function(obj){ console.log(obj.data); }) -
obj.data是当前选中行的完整数据对象,obj.checked恒为true(radio 点击即选中,无取消语义) - 注意:这个事件不提供“取消选中”回调,上一行自动取消但不会再次触发事件
- 若需跨页保持选中状态,得自己维护
selectedId并在done回调里手动设置checked
form 模块管,后者归 table 模块管,连事件名都不同,写错一个字母就不会触发。











