Layui表格中直接设disabled属性无效,因其渲染后DOM被重写;必须在templet中同时添加disabled属性和lay-disabled类,并调用layui.form.render()同步UI状态。
为什么 checkbox 在 Layui 表格里设了 disabled 却没反应?
layui 的 table.render() 渲染后,单元格里的 checkbox 是由 layui 自动重写的 dom(转成带样式的小方块),直接给原始 input[type="checkbox"] 加 disabled 属性或 js 控制 disabled,layui 不会同步更新它的 ui 状态,看起来“失效”了。
真正生效的方式是让 Layui 在渲染时就知道这个 checkbox 该禁用——靠列配置项 templet + 手动输出带 lay-disabled 类的 HTML,或者用 checked + disabled 同时写在 input 上,并确保 Layui 的复选框渲染逻辑能识别它。
- 必须在列定义的
templet中返回完整 HTML 字符串,不能只写<input type="checkbox"> - 禁用状态要同时满足:
disabled属性 +lay-disabled类(Layui 2.8+ 推荐),否则 UI 不同步 - 如果用了
checkCol(默认勾选列),它不支持动态只读,得换成自定义templet
如何用 templet 实现某几行 checkbox 只读?
核心是:在 templet 函数里根据 d(当前行数据)判断是否只读,然后拼出对应 HTML。Layui 会原样插入并自动执行 form 渲染。
{
title: '选择',
type: 'checkbox',
templet: function(d) {
// 假设 d.status === 0 表示不可操作
var disabled = d.status === 0 ? ' disabled lay-disabled' : '';
return '<input type="checkbox" name="checkbox" lay-skin="primary" disabled>';
}
}
-
lay-skin="primary"是必须的,否则样式不生效 - 不要漏掉
name属性,否则table.checkStatus()拿不到该列值 - 如果表格启用了
even或odd隔行色,禁用 checkbox 的视觉反馈(灰色)依赖lay-disabled类,缺了就只是点不动,但颜色还是正常色
切换只读状态时,怎么让已渲染的 checkbox 实时更新?
表格渲染完成后,不能靠改 data 再调 table.reload() 来刷新单个 checkbox 状态——太重,且会丢失当前页码、排序等状态。
更轻量的做法是:定位到对应行的 checkbox 元素,手动加/删属性和类,再触发一次 Layui 的表单重渲染。
// 假设要更新第 3 行(索引从 0 开始)、"选择"列的 checkbox
var tr = $('.layui-table-body tbody tr').eq(2);
var checkbox = tr.find('input[name="checkbox"]');
checkbox.prop('disabled', true).addClass('lay-disabled');
layui.form.render('checkbox', 'your-table-id');
-
layui.form.render('checkbox', 'your-table-id')的第二个参数是表格容器的id(不是 table 的 lay-filter),必须传,否则可能全局重渲染 - 别用
checkbox.attr('disabled', 'disabled'),要用prop,否则 jQuery 1.9+ 无法正确控制状态 - 如果该行被分页隐藏了,
tr.eq(2)会找不到——得先用table.cache['your-id']查数据,再通过table.getCheckData()或遍历 DOM 定位可见行
为什么用 table.on('checkbox') 监听时,只读 checkbox 还会触发事件?
这是 Layui 的一个常见误解:加了 disabled 的 checkbox,原生点击不会触发 change,但 Layui 的 checkbox 事件是绑定在父容器上的代理事件,它不管子元素是否 disabled,只要点击区域命中就会触发。
所以必须在监听回调里手动过滤:
table.on('checkbox(test)', function(obj){
// 检查当前 checkbox 是否被禁用
if ($(obj.elem).is(':disabled')) return;
console.log('正常勾选:', obj);
});
- 仅靠
obj.elem.disabled不可靠,因为 DOM 属性可能未同步,用 jQuery 的:disabled伪类更稳 - 别在
templet里用onclick="return false"拦截,Layui 的事件机制会绕过它 - 如果业务逻辑复杂(比如只读状态受多个字段影响),建议把判断逻辑抽成函数复用,避免重复写条件
lay-disabled 类和 form.render 的容器 ID —— 少一个,UI 就卡在“能看不能判”的状态。











