必须调用 form.render('select') 才能使 disabled 生效,因为 layui 隐藏原生 select、用 dl 模拟交互,disabled 不自动同步;需在 layui.use 回调内执行,ajax 插入后也要重渲染,且需处理事件、键盘等多层禁用。

直接加 disabled 属性但 UI 不变?漏了 form.render('select')
只在 <select></select> 标签上写 disabled,Layui 的美化下拉框(.layui-form-select)不会同步灰显或拦截点击——它把原生 select 隐藏了,用 <dl></dl> 模拟交互层,而 disabled 只作用于被隐藏的原始元素。
必须手动触发重渲染:
- 初始化时禁用:HTML 中写
<select name="xxx" disabled></select>,然后在layui.use('form', callback)里调form.render('select') - 动态禁用:
$('#mySelect').attr('disabled', 'disabled')后立刻跟form.render('select') - 启用时:
$('#mySelect').removeAttr('disabled')+ 再次form.render('select')
form.render('select') 调用时机错在哪?
常见报错 form is not defined 或渲染无效,基本都是时机问题:
- 不能在
layui.use外直接调用,必须等form模块加载完成 - 如果
select是 AJAX 插入的 DOM,得在插入后、且layui.use('form')回调内再调form.render('select') - 多个
select时,传'select'比不传参数更安全——不传默认只刷新checkbox/radio,下拉框会被跳过
禁用后还能点?检查这三处
点击仍弹出下拉菜单,说明禁用没真正生效:
- 打开开发者工具,确认原生
<select></select>元素是否真有disabled属性 - 看旁边
.layui-form-select下的<dl></dl>是否还存在——存在就说明form.render('select')没执行 - 如果用了
form.on('select(xxx)')绑定事件,禁用后该事件仍会触发一次(因为点击已发生),需在回调开头加判断:if ($(this).is(':disabled')) return;
想彻底禁用交互,光灰显不够
灰显只是视觉反馈,用户仍可能通过键盘(↑↓回车)选中选项——Layui 默认不拦截禁用项的键盘操作:
- 临时解法:在
change或form.on('select()')里校验,若选中的是被禁用的option,立刻重置值并再调一次form.render('select') - 更稳妥的做法:禁用时连同
.layui-form-select下的<dl></dl>一起移除:$('#mySelect').siblings('.layui-form-select').find('dl').remove(),再form.render('select') - 批量操作多个
option时,先集中设disabled,最后只调一次form.render('select'),避免频繁重绘卡顿
真正卡住人的不是写法本身,而是“禁用”这件事要同时管住 DOM 层、UI 层、事件层、键盘层——少一个环节,用户就能绕过去。











