layui单选框禁用必须给原生input[type="radio"]加disabled属性并调用form.render('radio');仅模板控制渲染适用于完全无权限场景,而DOM禁用+render适用于有查看权无编辑权场景。

layui单选框怎么根据权限禁用
必须给 input[type="radio"] 元素加 disabled 属性,再调用 form.render('radio');仅靠后端返回的权限字段控制模板渲染不够——禁用是交互层限制,不是隐藏。
为什么不能只靠模板不渲染某项
权限控制分两层:显示层和交互层。模板里用 {{# if(d.can_edit) { }} 确实能隐藏整组 radio,但一旦你本意是“保留 UI 但禁用”,比如灰显「已审核」状态不可改选,那必须走 DOM + render 路径。
- 模板不渲染 → 按钮压根不存在 → 适合「完全无权限」场景
- DOM 加
disabled+form.render('radio')→ 按钮还在,但点不动 → 适合「有查看权、无编辑权」场景 - 两者混用(比如部分选项禁用、部分隐藏)也常见,但得确保每个
input的disabled状态都独立设置
动态禁用某几个 radio 的正确写法
别直接操作 .layui-form-radio 这类包裹层 —— 它们是 layui 生成的模拟结构,禁用它们没用。真正起作用的是原生 input 元素。
- 先定位目标 radio:
document.querySelector('input[name="status"][value="2"]')或 jQuery:$('input[name="status"][value="2"]') - 设属性:
.prop('disabled', true)或.attr('disabled', 'disabled')(两者在 radio 上效果一致) - 立刻调用:
form.render('radio')—— 注意参数必须是'radio',传'select'或空字符串都不生效 - 批量操作时,先集中设所有目标
disabled,最后只调一次form.render('radio'),避免重复重绘卡顿
容易被忽略的坑
禁用后用户仍可能通过键盘(Tab + 空格)触发选择 —— layui 默认不拦截 disabled radio 的键盘事件。如果业务强要求阻断,得手动监听 form.on('radio(filter)') 回调,在里面加判断:
form.on('radio(status)', function(data){
var $elem = $(data.elem);
if ($elem.is(':disabled')) {
$elem.prop('checked', false);
return;
}
});最麻烦的是:禁用状态不会自动同步到 form.val() 结果里。提交前若需排除禁用项的值,得自己遍历 input[name="status"]:not(:disabled):checked 取值,而不是依赖 form.val('filter')。


















