角色校验逻辑须用javascript动态控制而非html属性:根据角色映射规则设置required/pattern等约束,提交前主动checkvalidity并setcustomvalidity提示,隐藏字段需remove而非hidden,确保校验与数据契约一致。

角色校验逻辑不能塞进 HTML 属性里
HTML 的 required、pattern 这类属性是静态的,写死在标签上就固定了,没法根据用户角色动态开关。比如“编辑”要填手机号,“审核员”却不用——你不能给同一个 <input> 同时加又不加 required。硬写两套表单再用 hidden 切换,会导致 DOM 冗余、可访问性断裂、表单提交逻辑混乱。
用 JavaScript 按角色动态设置约束状态
核心是把校验规则和角色绑定,而不是和 DOM 绑定。先定义角色规则映射:
const roleRules = {
editor: { phone: { required: true, pattern: /^1[3-9]\d{9}$/ } },
reviewer: { phone: { required: false } },
admin: { phone: { required: true, pattern: /^1[3-9]\d{9}$/, maxlength: 11 } }
};
再在角色切换后,批量更新对应字段的原生约束:
- 调用
inputElement.setCustomValidity('')清空旧错误 - 用
inputElement.required = rules.phone.required控制必填 - 用
inputElement.pattern = rules.phone.pattern动态设正则(注意:改pattern不会自动触发重校验,得手动inputElement.checkValidity()) - 别忘了同步
maxlength、minlength等数值型约束
提交前必须重新 run 一次全量校验
用户可能绕过实时反馈直接点提交,或者在角色切换后手动改了输入值。所以 submit 事件里不能只依赖浏览器默认行为,得主动干预:
- 阻止默认提交:
e.preventDefault() - 遍历所有受角色影响的字段,逐个调用
field.checkValidity() - 对失败字段,用
field.setCustomValidity('该角色下此项为必填')注入上下文提示 - 只要有一个失败,就不再发请求;全部通过才调用
form.submit()或 fetch 提交
漏掉这一步,就会出现“明明角色已切为 reviewer,提交时却还卡在手机号校验”的问题。
隐藏字段 ≠ 移除校验,该删的得真删
有些角色下整个字段不该存在(比如“合同金额”只对财务可见),这时候光用 hidden 不够——它只是视觉隐藏,form.elements 里还在,form.submit() 仍会序列化它。正确做法是:
- 用
field.remove()从 DOM 中彻底移除节点 - 或提前用
form.querySelectorAll('[data-role-field]')批量清理,再按当前角色重新form.appendChild()插入对应字段 - 千万别用
display: none+ 原生校验混搭,浏览器会校验不可见字段,报错却找不到对应 UI
角色权限不是样式开关,是数据契约的切换。字段存在与否、是否参与校验、提示文案怎么写,都得跟着角色走,不能靠 CSS 或属性开关蒙混过关。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











