动态禁用 select 元素需同时设置 disabled 属性(推荐 .prop('disabled', true))和调用 form.render('select'),否则 UI 仍可点击、键盘可聚焦;禁用单个 option 必须用原生 disabled 属性并重新渲染;禁用项不参与表单提交,需用 readonly+隐藏域或提交前临时移除 disabled。

动态禁用整个 select 元素
禁用整框必须同时操作原生 disabled 属性和触发 form.render('select'),否则 UI 仍可点击、键盘仍能聚焦。
- 用
.attr('disabled', true)或.prop('disabled', true)设置属性(推荐后者) - 紧接着调用
layui.form.render('select'),不传参数或传错类型(如'checkbox')都不生效 - 启用时用
.removeAttr('disabled')+ 再次form.render('select') - 若在
form.on('select()')回调里禁用,事件本身已触发一次,需开头加守卫:if ($(this.elem).is(':disabled')) return; - 键盘上下键默认不拦截,需额外绑定:
$(this.elem).on('keydown', e => { if ($(this.elem).is(':disabled')) e.preventDefault(); });
动态禁用某一个 option
只能靠原生 option 标签的 disabled 布尔属性,lay-data、CSS 类、JS 设样式全无效。
- 正确写法:
<option value="2" disabled>上海</option>;disabled="false"或disabled="0"都不生效 - JS 修改:
document.querySelector('select[name="city"] option[value="2"]').disabled = true;,IE11 下建议 fallback 到遍历this.elem.options - 改完必须立刻调
layui.form.render('select'),否则下拉面板里该选项依然可点、可键盘选中 - 批量禁用多个 option 时,先统一设
disabled,最后只调一次form.render('select'),避免卡顿 - 键盘回车仍可能选中禁用项——Layui 没自动跳过,需在
change里手动校验:if (e.target.selectedOptions[0]?.disabled) { e.target.value = ''; layui.form.render('select'); }
禁用后表单提交值丢失怎么办
disabled 元素的值默认不参与表单提交,这是浏览器原生行为,和 Layui 无关。
- 如果业务上需要保留值但禁止修改,改用
readonly+ 隐藏域同步值,或提交前临时移除disabled - 不要依赖 JS 在 submit 事件里取
val(),因为disabled的 select 返回空字符串 - 检查是否误用了
form.val()——它会跳过disabled字段,应改用原生select.value或 DOM 属性读取
常见失效场景和绕过方式
禁用逻辑看似写了,但 UI 不变、事件照常触发,大概率是这几个点没对上。
-
form.render('select')必须在layui.use('form', callback)内执行,外层调用会报form is not defined - 异步插入的
select(如 AJAX 后append),必须在插入 DOM 后再调form.render('select') - 表格内动态渲染的 select(如
templet生成),禁用状态会在table.reload()后丢失,必须在done回调里重置 - 用 jQuery 选择器定位错误,比如
$('select')匹配到多个,结果禁用了不该禁的;建议加name或id精准限定


















