最可靠禁用 select 的方式是设 disabled 属性并调用 form.render('select'),但 disabled 会导致提交丢失值;readonly 对 select 无效,Layui 也不识别;需手动拦截键盘事件并确保监听在 render 后绑定。

直接设 disabled 属性是最可靠的方式,但要注意它会导致表单提交时丢失值——如果你需要保留值又不让用户改,得用其他组合手段。
为什么不能用 readonly?
HTML 原生 select 元素根本不支持 readonly 属性,加了也无效。浏览器会直接忽略。Layui 的模拟下拉层更不会识别这个属性。所以所有“给 select 加 readonly”的尝试,结果都是:UI 看起来可点、键盘能聚焦、回车还能选——完全没锁住。
设 disabled 后必须调 form.render('select')
Layui 渲染后,DOM 上的 select 元素只是“壳”,真正显示的是它生成的 .layui-form-select 结构。只改原生 disabled 属性,UI 层不会同步变灰或禁用点击。
- 正确顺序是:
$(elem).attr('disabled', 'disabled')→form.render('select') - 如果用
layui.form.render('select', '#mySelect')带选择器重渲染,也必须确保该选择器能匹配到原始select元素(不是 .layui-form-select) - 禁用后想恢复?用
$(elem).removeAttr('disabled')再调一次form.render('select')
禁用了还被键盘操作?手动拦截 keydown
Layui 默认不检查 disabled 状态就响应键盘上下键和回车,导致用户仍能用键盘切换并确认选项——这是个已知行为,不是 bug,是它的事件模型没做这层守卫。
- 在
form.on('select(filterName)')回调里加:$(this.elem).on('keydown', function(e){ if ($(this).is(':disabled')) e.preventDefault(); }); - 注意:这个监听必须在
form.render('select')之后绑定,否则this.elem对应的 DOM 可能还没挂载完成 - 更保险的做法是在事件开头加守卫:
if ($(this.elem).is(':disabled')) return;,避免后续逻辑误执行
要保留值又禁用交互?别只靠 disabled
如果表单提交必须带上这个字段的值,但 UI 上又不能让用户改,disabled 就不合适——它会让字段不参与提交。
- 方案一:用
readonly配合隐藏域 —— 给input设readonly并显示当前值,再放一个同名input type="hidden"存真实值;select本身不参与表单,仅作展示 - 方案二:提交前临时移除
disabled—— 表单 submit 事件中先$(select).removeAttr('disabled'),提交后再设回去(适合简单场景) - 方案三:监听
change或select事件,一旦检测到值变化就layer.msg提示并$(select).val(prevVal).trigger('change')强制还原(伪只读)
最常被忽略的一点是:键盘操作的拦截必须写在 form.render() 之后,且需检查元素是否真被禁用——否则看似禁用了,实则形同虚设。











