必须手动清空、追加option并显式调用form.render('select','filter'),否则下拉框“有内容但点不动”或“选中无效”;动态加载前需收起面板、清除辅助dom;后端数据须转义双引号;option须设selected属性;render必须传filter参数;搜索型select要禁用本地过滤;移动端面板偏移需settimeout重算定位。

必须手动清空、追加 option,再显式调用 form.render('select', 'filter')——Layui 不会自动识别 DOM 变化,跳过任一环节都会导致下拉框“有内容但点不动”或“选中无效”。
动态加载前先收起面板并清空 DOM
Layui 渲染后会生成额外的 .layui-form-select 面板结构,AJAX 加载期间若用户已展开下拉,旧面板不会自动关闭,会导致视觉残留甚至点击失效。
- 发起请求前主动收起:执行
$('.layui-form-select dl').removeClass('layui-anim-upbit')和$('.layui-form-select dd').removeClass('layui-this') - 清空原
select时,不能只用$('#mySelect').empty()——它不清理 Layui 插入的辅助 DOM,必须连同自动生成的.layui-form-select一起重置,最稳妥做法是:$('#mySelect').empty().next('.layui-form-select').remove() - 确保后端返回数据不含未转义双引号(如
"name": "张"三"),否则.html()插入会静默截断,控制台无报错但选项缺失
追加 option 后必须带 selected 属性
Layui 默认显示“请选择”,哪怕你 JS 调用 $('#mySelect').val('2'),如果对应 <option></option> 没有 selected 属性,渲染后依然不生效。
- 手动拼接时,显式写
<option value="2" selected>上海</option> - 循环追加时,用
.prop('selected', true)同步 DOM 属性:$('#mySelect option[value="' + data.defaultId + '"]').prop('selected', true) - 注意:
.attr('selected', true)在某些版本中不生效,必须用.prop()
form.render() 的 filter 参数不能漏
如果表单容器设置了 lay-filter="userForm",调用 form.render('select') 会全局重绘所有 select,可能误刷其他模块的下拉框,造成值丢失或样式错乱。
- 务必传入第二个参数:
form.render('select', 'userForm') - 没设
lay-filter时才可用form.render('select'),但强烈建议统一加上,避免后期扩展出问题 - 如果页面存在多个独立表单,每个都应配唯一
lay-filter值,且 render 时一一对应
搜索型 select 要关掉本地过滤
想实现“输入关键词 → 请求后端 → 返回匹配项”,必须禁用 Layui 自带的前端搜索逻辑,否则输入触发的是本地 filter,根本不会发请求。
- 初始化时设
search: false - 用
request函数接管请求配置:request: function(opts) { return { url: '/api/areas', data: { keyword: opts.keyword } } } -
parseData里把后端返回的{code:0, data: [...]}转成数组格式:return { data: res.data }
最易被忽略的是:移动端上,form.render() 后面板定位可能偏移,尤其在滚动后触发加载。这不是 bug,是 Layui 依赖初始视口计算位置,临时解法是在 render 后加 setTimeout(() => $('.layui-form-select').find('dl').css('top', 'auto'), 10) 强制重算,但长期应考虑用 dropdown 替代 select 做更可控的下拉交互。











