layui中禁用select需同时设置disabled属性并调用form.render('select'),否则美化下拉框仍可交互;动态操作时须用.attr()/removeattr()配合render,且render必须在layui.use('form')回调内执行。
直接在 <select></select> 标签上加 disabled 属性就能禁用,但必须调用 form.render('select') 才能生效——这是 layui 表单组件的渲染机制决定的,不是原生行为。
HTML 中直接写 disabled 属性
最简单的方式是初始化时就禁用,比如后台返回数据表明该字段不可编辑:
<select name="status" disabled><option value="">请选择状态</option> <option value="1">启用</option> <option value="0">停用</option></select>
注意:仅加 disabled 不够,Layui 的美化下拉框(.layui-form-select)不会自动同步这个状态,必须触发重渲染。
JS 动态设置 disabled 并刷新渲染
运行时根据条件禁用/启用,常见于权限控制或表单联动场景:
- 用 jQuery 设置属性:
$("#mySelect").attr("disabled", "disabled")或.prop("disabled", true) - 必须紧接着调用:
form.render('select'),否则 UI 不变、仍可点击 - 启用时用:
$("#mySelect").removeAttr("disabled")+ 再次form.render('select') - 如果页面有多个 select,建议只传具体类型(如
'select'),避免全量重绘影响性能
禁用后点击仍弹出下拉菜单?
这是典型未刷新渲染的表现。Layui 把原生 <select></select> 隐藏,用 <dl></dl> 模拟下拉面板;disabled 只作用于原生元素,不自动关闭模拟层。
验证方法:打开开发者工具,检查 <select></select> 是否带 disabled 属性,再看旁边 .layui-form-select 下的 <dl></dl> 是否还存在。若存在,说明 form.render('select') 没执行。
补充技巧:想彻底移除下拉交互(连点击都不响应),可手动删掉 <dl></dl>:
$("#mySelect").siblings(".layui-form-select").find("dl").remove();
form.render('select') 的依赖和时机
这个方法必须在 layui.use('form', ...) 回调内调用,且 form 实例已加载完成:
- 不能在
layui.use外直接调用,会报form is not defined - 如果 select 是异步插入 DOM(如 AJAX 后 append),需在插入后再调用
form.render('select') - 多次调用无副作用,但没必要频繁触发;建议封装成函数统一管理
真正容易被忽略的是:禁用逻辑写在 form.on('select(...)') 里时,事件本身仍会触发一次——因为禁用只阻断后续交互,不撤回当前点击。需要在事件回调开头加判断:if ($(this).is(':disabled')) return;。











