layui is not defined 错误表明 layui.js 未成功加载,主因是路径错误、加载顺序不当或脚本阻塞;必须确保 layui.js 在所有依赖代码前加载,并在 layui.use(['form'], callback) 回调内执行 form.render('select')。

layui is not defined 报错直接说明模块根本没加载成功
这不是渲染逻辑问题,而是执行 form.render('select') 之前,layui 这个全局对象压根不存在。所有依赖 layui 的操作(包括 layui.use、layui.form)都会直接中断报错。
常见原因就三个:layui.js 文件路径错误、加载顺序不对、或被其他脚本阻塞。别急着查 form.render 参数,先确认基础环境是否就绪。
- 打开浏览器开发者工具的 Network 面板,过滤
layui.js,看它是不是 404 或状态码异常 - 检查 HTML 中
<script src=".../layui.js"></script>的src路径——别手敲,用 IDE 自动补全或右键“复制链接地址”核对 -
layui.js必须在任何调用layui.use或layui.xxx的 JS 代码之前加载;如果放在</body>底部,但你的初始化脚本在<head>里,就会出这个问题 - 如果用了 jQuery,且在
layui.js之前加载了jquery.js,注意:Layui 1.x 不依赖 jQuery,但如果你写了var $ = layui.$却没先加载layui,也会连带报$ is not defined
form.render('select') 执行前必须确保 form 模块已就绪
即使 layui 加载成功,form 模块也未必可用。layui.use(['form'], callback) 不是可选步骤,而是强制前提——callback 内部才是 form 实例真正可用的唯一安全区域。
以下写法全部错误:
- 在
layui.use外直接写form.render('select') - 写了
layui.use('form', function(){ ... }),但把form.render('select')放在函数外面 - 用
setTimeout延迟调用,却没包在layui.use回调里
正确姿势只有一种:
layui.use(['form'], function(){
var form = layui.form;
// ✅ 此处 form 已定义,可安全调用
form.render('select');
});
动态插入 select 后渲染仍失败?重点检查 DOM 位置和 class
报错消失不代表渲染成功。如果下拉框还是原生样式,大概率是 form.render('select') 根本没找到目标元素——不是代码错了,是 DOM 结构不满足识别条件。
- 目标
<select>必须位于一个带class="layui-form"的容器内(<form>、<div>都行),且该容器不能是 document.body 的临时 fragment 或未挂载节点 - 动态插入时,不要只改
innerHTML就立刻调form.render;得等插入动作真正完成:$('#container').html(htmlStr).promise().done(() => form.render('select')),或者用setTimeout(() => form.render('select'), 0) - 如果容器加了
lay-filter="xxx",渲染时必须传第二个参数:form.render('select', 'xxx');大小写、空格、引号都必须完全一致,否则视为无效 filter
layer 弹层里的 select 渲染失效,不是 bug 是设计约束
Layer 弹窗内容默认插入到 document.body 最后,脱离原始 DOM 上下文。这意味着:初始化时的自动扫描不会覆盖它,form.render() 若在弹层创建前执行,也找不到这些元素。
解决方案非常明确——只在弹层内容确定挂载后,再针对性渲染:
- 如果是用
layer.open({content: '<select>...</select>'}),在success回调里调用:success: function(layero){ form.render('select'); } - 如果是用
content: $('#template')方式,确保模板 DOM 已存在且父容器有class="layui-form",再在success中渲染 - 避免在
layer.open外部提前执行form.render,它对尚未存在的节点无意义
最易忽略的一点:多个 layer 弹层共用同一份 HTML 模板时,若未给每个 select 分配唯一 lay-filter,用 form.render('select', 'xxx') 可能只刷中第一个,其余静默失效。


















