layui is not defined 表明 layui 全局对象未加载,根本原因是 layui.js 未正确引入(路径错误、被拦截、加载顺序不当)或未通过 layui.use() 初始化模块;需确保 script 标签置于 jquery.js 后、其他脚本前,network 面板状态码为200,并在 layui.use 回调中使用模块。

layui is not defined 不是单选框专属问题,而是整个 Layui 环境没加载成功。只要看到这个报错,说明 layui 全局对象根本不存在,后续所有模块(form、layer、table)都用不了——单选框只是第一个撞上的。
layui.js 是否在最前面且路径正确?
这是 90% 场景的根因。Layui 必须在任何调用它的地方之前加载,且不能被拦截或 404。
-
layui.js的<script></script>标签必须放在jquery.js之后、但所有其他 JS(尤其是你自己的初始化脚本)之前 - 路径别手敲:用 IDE 自动补全或右键“复制路径”,确保浏览器 Network 面板里
layui.js返回状态码是200,不是404或403 - Spring Boot + Shiro 项目常见坑:
shiroFilter拦截了/static/layui/**路径,需在ShiroConfig中显式放行静态资源
单选框依赖的 form 模块是否被正确 use?
即使 layui 对象存在,form 模块也未必就绪。Layui 的模块是按需加载的,form.render() 这类调用必须包裹在 layui.use('form', ...) 回调里。
- 直接写
layui.form.render()会报Cannot read property 'render' of undefined,因为layui.form还没注入 - 正确写法:
layui.use('form', function(){ var form = layui.form; form.render('checkbox'); /*注意:单选框是 radio,不是 checkbox*/ }); - 如果页面有多个模块要初始化(比如同时用
form和table),用数组:layui.use(['form', 'table'], function(){...})
HTML 结构是否满足 form 渲染前提?
Layui 的表单控件(包括单选框)不是纯 CSS 样式,它依赖 DOM 结构和 class 标识才能被 form.render() 识别并增强。
- 包裹单选框的容器必须有
class="layui-form",否则form.render()不会处理内部元素 - 单选框本身要带
name属性(用于分组),且每个input[type=radio]应有title或配套label,否则渲染后可能无文字 - 不要在
layui.use外部直接操作 DOM 绑定事件,比如document.getElementById(...).onclick = ...,应统一用form.on('radio(filter)', callback)
真正容易被忽略的是:错误常叠加出现。比如路径错了导致 layui is not defined,你改完路径又忘了加 class="layui-form",结果单选框不渲染,误以为还是 JS 问题。建议每次只改一个点,用 Network 和 Console 交叉验证——先确认 layui.js 加载成功,再确认 layui.use 回调执行了,最后检查 DOM 结构是否合规。











