必须在原生<option>标签上直接写disabled布尔属性才能禁用单个选项,写disabled="false"或在<select>上加disabled均错误;动态修改后需调form.render('select')重绘,且须处理键盘焦点绕过、数据源同步及批量操作性能问题。

直接给
禁用单个选项,不是靠lay-data或JS设样式,而是必须在原生<option>标签上写disabled这个布尔属性。浏览器原生就支持它:置灰、鼠标点不了、键盘跳过、提交时自动忽略该值。
常见错误是写disabled="false"或disabled="0"——这些全无效;也有人误在<select>上加disabled,那禁的是整个下拉框,不是某一项。
-
<option value="admin" disabled>管理员(暂未开放)</option>✅ 正确写法 -
<option value="admin" disabled="false">...</option>❌ 无效 -
<select disabled>...</select>❌ 禁用整框,非单选项
动态禁用必须改原生option再render('select')
Layui 渲染后会隐藏真实<select>,用伪DOM模拟下拉面板。你直接操作伪元素(比如.layui-form-select dd)没用,得改原始<option>节点,再调form.render('select')让它重绘界面。
不传参数或传错类型,form.render()不会更新下拉框——默认只刷checkbox/radio。
- 禁用
value="2"的选项:document.querySelector('select[name="city"] option[value="2"]').disabled = true;,然后layui.form.render('select', 'your-form-filter'); - IE11 下
querySelector('option[value="..."]')可能不稳定,建议 fallback 到遍历select.options - 用模板引擎(如 Thymeleaf)预渲染时,确保服务端已写好
disabled,否则首次加载就漏掉
键盘操作仍能选中禁用项?得手动拦截
Layui 没监听disabled状态做键盘校验。↑↓键焦点仍可停在禁用项上,按回车照样触发选择——UI看起来灰了,逻辑上却没拦住。
临时解法是在form.on('select()')里加判断:选中的值若对应一个disabled的<option>,立刻清空select.value并再调一次form.render('select')。
- 别只靠
disabled属性指望“一劳永逸”,鼠标、键盘、初始渲染、JS动态改,四个环节少一个,用户就能绕过去 - 如果禁用逻辑依赖后端返回的状态(比如权限字段),记得同步更新本地数据源,否则翻页或刷新后禁用失效
批量禁用别循环调render,性能会卡
频繁调form.render('select')会触发整表单重绘。循环里每禁一个选项都render一次,页面明显卡顿。
正确做法是:先集中修改所有目标option.disabled,最后只调一次form.render('select')。Layui 2.8+ 还支持按ID精准刷新:form.render('select', 'mySelectId'),比全局刷新轻量得多。
最麻烦的从来不是怎么写那一行disabled = true,而是得同时兜住 DOM、渲染、键盘、数据源四头——漏掉任何一头,禁用就形同虚设。


















