layui表格所有单元格默认只读,必须显式配置列的edit属性(如edit: 'text')才可编辑;未配置edit时,绑定click/dblclick事件或监听cell事件均无法触发编辑。
列配置不加 edit 就是默认只读
layui 表格所有单元格天生只读,根本不需要额外“禁用”——只要列定义里没写 edit: 'text' 这类字段,双击或单击都不会弹出输入框。很多人踩坑是因为误以为绑了 table.on('cell()') 就能编辑,其实那只是监听点击事件,和编辑能力完全无关。
常见错误现象:点了半天没反应、console 也没报错、数据就是改不了。
- 检查列配置是否漏写了
edit属性(比如写成editor或拼错) - 确认没在
templet里手动渲染 input,否则edit会被忽略 - 别在
done回调里用 jQuery 去设contentEditable="false",这是多余且干扰 layui 内部状态的
table.on('edit()') 里 return false 不等于禁用编辑
这个事件是编辑**已触发后**的回调,不是拦截器。你在这里 return false 只会阻止后续逻辑(比如保存),但 input 已经渲染出来了,用户照样能输、能删、能失焦提交——数据甚至会进 table.cache,只是你没处理而已。
真正想让某列/某行不可编辑,必须从源头控制:
- 静态场景:列配置直接不写
edit - 动态场景:在
done回调里用$('tr[data-index="0"] td[data-field="status"]').data('edit', false) - 条件判断:比如
if (item.status === 'done') { ... }再设data('edit', false)
移动端单击进编辑?先关掉 event: 'click' 配置
如果你在列里写了 event: 'click',桌面端和移动端都会变成单击激活编辑——但很多安卓 WebView 和 iOS Safari 对 click 有 300ms 延迟或误判为文字选中,结果点一下没反应,用户以为卡了。
更稳的做法是保持默认双击(event 不配),然后确保页面 <meta name="viewport"> 没禁用缩放,否则 click 事件本身就不准。
如果真要适配移动端,别硬切 click,而是用 layui.device() 判断后动态设置列配置:
var isMobile = layui.device().mobile;
var cols = [[
{field: 'name', title: '姓名', edit: isMobile ? 'text' : null, event: isMobile ? 'click' : null}
]];
导出 Excel 时想让某些列只读?Layui 不支持,别白费劲
table.exportFile() 只生成 CSV,CSV 根本没有“只读列”概念。你看到的所谓“保护”,Excel 打开 CSV 后全靠手动设工作表保护——而且每次打开都要重新设,毫无意义。
真实需求其实是:导出时不希望别人改 ID、创建时间这类字段。解决方案就两个:
- 导出前过滤掉这些列:
exportFile('报表', data.map(item => ({...})) - 用 SheetJS(xlsx)生成 .xlsx,再调用
ws['!protect'] = {password: 'xxx'}并手动锁定单元格样式
记住:layui 的表格编辑机制只管渲染和缓存,它不管导出、不管权限、也不管 Excel 的保护逻辑——这三个边界划清了,就不会在错误方向上调试半天。











