Layui 单选框不支持 readonly 属性,因为它遵循 HTML 标准,单选框仅支持 disabled;如果需要禁用,应使用 disabled 并调用 form.render() 刷新 UI。在表格场景中,通常需要结合 pointer-events:none 与事件拦截,才能同时实现视觉上的禁用效果和交互限制。

Layui 的单选框(type: 'radio')并不支持 readonly 属性——也就是说,它不会渲染出带有 readonly 的 元素,同时也不会对该属性做任何响应。即使手动添加,浏览器通常也会忽略,Layui 在渲染过程中还可能将其覆盖掉,因此实际不会生效。
为什么 radio 不能添加 readonly 属性
从 HTML 原生规范来看, 和 这两类表单控件,本身就没有 readonly 属性,它们只能使用 disabled。Layui 也是按照这套规则来实现的:它会把所有 radio 渲染成自定义 UI(.layui-form-radio),而底层的 input 主要负责状态同步,并且只识别 disabled 状态。
- 在 HTML 源码中直接添加
readonly→ 渲染后会消失,控制台有时还会出现 warning - 通过 JS 设置
elem.readOnly = true→ 依然无效,因为 Layui 不监听 readOnly 的变化 - 如果你想实现“只读但仍可聚焦或复制”的效果 → radio 组件本身并不支持这种交互逻辑
真正可行的替代方法:使用 disabled 控制是否可选
如果你的需求是“禁止用户切换单选项”,那么最稳定、最标准的做法就是使用 disabled:
- 在配置项中设置
disabled: true(该方式通常只适用于表单中的独立 radio 组件,不适用于表格内的 radio 列) - 对于已经渲染完成的 radio,可以通过 JS 找到对应的
并设置disabled:document.querySelector("input[name='gender'][value='1']").disabled = true; - 设置完成后要记得执行
layui.form.render('radio'),否则 Layui 的界面样式不会同步更新
表格中 type: 'radio' 列如何“禁用整行”
在 Layui 表格里,type: 'radio' 通常是整列统一控制的,不能直接针对某一行单独设置 radio 禁用。更常见、也更实用的处理方式包括:
- 在
cols中为该列配置unresize: true, style: 'pointer-events: none;',从而实现视觉变灰和点击失效的效果 - 监听
table.on('radio(filter)')事件,在回调中判断当前行是否允许被选中;如果不允许,可以直接return false,或者手动取消选中状态:obj.tr.find("input[type='radio']").prop("checked", false); - 需要注意的是:
disabled属性对表格中的 radio 列通常不起作用,因此单纯添加该属性并不能达到预期效果
实际开发中,更需要分清“视觉禁用”和“数据锁定”这两个概念——disabled 会导致对应字段不参与表单提交,而仅仅通过隐藏、变灰或添加样式,并不会影响数据本身。如果你的目标是不允许用户点击,但又必须保留提交值,那么应采用事件拦截 + 手动控制 checked 状态的方案,而不是尝试给 Layui 单选框增加并不存在的 readonly 语义。
