能,但仅限input、select、textarea、button、output等原生表单控件;legend内元素、非表单元素、hidden输入框、自定义组件及脱离DOM继承链的控件均不受影响,且禁用后值不提交。

能一键禁用,但只对原生表单控件生效,且必须确保子元素没“自己作对”——加了 disabled 属性或脱离 DOM 继承链,就会失效。
fieldset disabled 能禁用哪些元素?
它只影响标准可交互表单控件:input、select、textarea、button、output。其他统统不管:
-
legend里的内容(哪怕里面塞了input)不受影响,规范强制允许操作 -
label、div、span等非表单元素点击照常触发事件 -
input[type="hidden"]仍会随表单提交,视觉也不灰化 - Vue/React 封装的自定义组件、Shadow DOM 内部控件、
contenteditable区域完全不响应
为什么加了 disabled 还有 input 可点?
不是属性没起作用,而是被更优先的规则覆盖或绕过了:
- 子
input自己写了disabled=""或disabled="false"—— 只要属性存在,浏览器就认,父级无法覆盖 -
label的for指向了fieldset外的input,点击 label 实际激活的是外部控件 - 用了
position: absolute或display: contents,导致控件在视觉上在 fieldset 内、DOM 结构上却不在其子树中 - JavaScript 直接调用
.focus()或监听click,禁用只拦原生行为,不拦 JS 执行
JS 动态控制时该用什么写法?
直接赋布尔值,别碰 setAttribute:
立即学习“前端免费学习笔记(深入)”;
- 禁用:
document.querySelector('fieldset').disabled = true - 启用:
document.querySelector('fieldset').disabled = false - 避免:
removeAttribute('disabled')—— Safari ≤15.6 和 IE11 下 UI 不重绘,看着灰实则可点 - 禁用后焦点不会自动移出,若之前有元素聚焦,得手动
nextFocusable.focus()
禁用后值还传不传?
不传。这是和 readonly 的本质区别:
-
fieldset[disabled]下所有子控件的值**不会出现在 FormData 中,也不会被序列化进表单提交请求体** -
readonly只对input/textarea有效,且值照常提交;对select、checkbox完全无效 - 如果业务需要“显示但不可改、值必须传”,就得用
readonly+ CSS(比如pointer-events: none),而不是disabled
最麻烦的是嵌套:外层 fieldset 设了 disabled,里面再包一个没设 disabled 的 fieldset,它的子控件依然不可用——禁用状态继承,无法被子级取消。



















