直接设 elem.readonly = true 不生效,必须配合 layui.form.render('input') 同步 ui;readonly 字段值可提交且受 required 校验,disabled 则不提交且跳过校验。

直接设 elem.readOnly = true 不生效?必须同步 UI
只改 DOM 的 readOnly 属性,Layui 的边框样式、校验逻辑、甚至点击反馈都不会变——用户还能点、能聚焦、lay-verify 仍会报错。真正生效的两步是:elem.readOnly = true + layui.form.render('input')。
- 用原生 JS:
document.getElementById('price').readOnly = true; layui.form.render('input'); - 用 jQuery:
$('select[name="category"]').attr('readonly', 'readonly'); layui.form.render('select'); - 参数
'input'或'select'很关键:只刷新对应类型控件,避免重绘整表单拖慢响应
disabled 和 readonly 到底该选哪个?看提交和校验需求
两者视觉上都“点不动”,但行为天差地别:
-
disabled:值不随表单提交,form.val()返回undefined,required校验自动跳过 -
readonly:值照常提交,form.val()能取到,required仍会校验(哪怕用户不能改) - 用户可聚焦、选中、复制
readonly内容;disabled连光标都不出现 - 若要视觉一致(比如都灰背景),得手动加 CSS:
background: #f5f5f5; color: #666;
下拉框(select)没有 readonly 属性,只能禁用或模拟
HTML 标准里 select 不支持 readonly,硬加无效。可行方案只有两个:
- 设
disabled+form.render('select'):最简单,但值不提交;如需传值,得额外加隐藏域存原始值 - 监听
keydown拦截键盘操作:在form.on('select()')里加$(this.elem).on('keydown', e => e.preventDefault()),再配合 CSSpointer-events: none阻止鼠标,勉强模拟只读 - 禁用特定
option?先$('#mySelect option[value="draft"]').prop('disabled', true),再form.render('select'),否则 UI 不更新
表格里某单元格只读,templet 是唯一可靠方式
Layui 表格列级只读靠 edit 配置控制,但“某行某列动态只读”必须用 templet 手动拼 HTML:
- 在
templet函数里判断状态:if (d.status === 'done') { return '<input readonly value="' + d.name + '" style="background:#f5f5f5;cursor:not-allowed;">'; } - 必须显式写
readonly属性,不能指望 JS 后续设置——模板渲染完 DOM 就固定了 - 即使加了
readonly,table.on('edit()')仍会触发:回调开头加if ($(obj.elem).attr('readonly')) return; - 阻止聚焦失焦闪烁:
$(obj.elem).on('focus', function(){ this.blur(); });











