Layui按钮禁用必须同时设置disabled属性和layui-btn-disabled类,且需在templet中动态控制并配合事件回调二次校验;表单元素禁用后须调用form.render()同步UI。
按钮禁用必须同时操作 DOM 属性和 CSS 类
只设 disabled 属性或只加 layui-btn-disabled 类都不行:前者没灰显效果,后者仍能触发 lay-event。layui 的按钮事件是委托监听的,disabled 不会阻断事件冒泡。
- 禁用:
$('#btn').attr('disabled', true).addClass('layui-btn-disabled') - 恢复:
$('#btn').removeAttr('disabled').removeClass('layui-btn-disabled') - 若按钮带
lay-filter(如lay-filter="save"),建议用属性选择器定位:$('button[lay-filter="save"]') - 移动端需在
touchstart阶段就禁用,避免 300ms 延迟导致重复点击
表格行内按钮按数据状态禁用,必须用 templet
顶部 toolbar 拿不到单行数据上下文,没法动态判断;只有列配置里的 templet 能访问当前行对象 d,这是唯一稳定方式。
- 删掉
{ toolbar: '#barDemo' }这类全局工具栏引用 - 改用列定义:
{ field: 'status', title: '操作', templet: '#actionTpl' } - 模板中写:
{{# if(d.status === 'locked') { }}<button class="layui-btn layui-btn-xs layui-btn-disabled">编辑</button>{{# } else { }}<button class="layui-btn layui-btn-xs" lay-event="edit">编辑</button>{{# } }} -
lay-event只对非disabled按钮生效,禁用按钮别加它
事件回调里必须二次校验数据状态
用户可能手动删掉 DOM 上的 disabled 或用键盘触发 lay-event,仅靠模板禁用只是第一道防线。
- 所有
table.on('tool(filter)', ...)回调开头都加守卫:if (obj.data.status === 'locked') return; - 不要查按钮 DOM 状态(如
$(obj.tr).find('button').prop('disabled')),DOM 可能已重载失效 - 状态判断逻辑建议抽成独立函数,尤其涉及多字段组合(如
status+role)时 -
table.reload()后所有手动加的禁用状态都会丢失,templet是唯一能自动重建的方式
表单元素禁用后要调 form.render()
Layui 封装过的组件(select、checkbox、radio)不响应原生 disabled,必须触发重绘才能同步 UI 和交互状态。
- 文本框:
$('#input').attr('disabled', true); layui.form.render('input'); - 下拉框:
$('select[name="city"]').attr('disabled', true); layui.form.render('select'); - 复选框/单选框:禁用原始
input元素,再layui.form.render('checkbox')或render('radio') - Layui 2.8 及更早版本没有
form.disable(),别被文档误导;3.x 才支持,且要求字段已注册
表格重载、分页、排序都会重建 DOM,任何靠 JS 动态加的 disabled 或 class 都会消失。真正可靠的禁用,永远落在模板渲染和事件守卫这两层上。


















