disabled 是布尔属性,只要存在即禁用,与值无关;JS 应用 element.disabled = true/false 控制;禁用后字段不参与表单提交;批量禁用用 fieldset disabled;readonly 不能替代 disabled 防改。

直接写 disabled 就生效,别赋值也别加引号
只要在 <input> 标签里出现 disabled 这个词,浏览器就立刻禁用——不管写成 <input disabled>、<input disabled=""> 还是 <input disabled="disabled">,效果完全一样。写 disabled="false" 或 disabled="0" 是常见误解,它照样禁用,因为 HTML 里 disabled 是布尔属性,只看“有没有”,不看“值是什么”。
element.disabled = true/false 是 JS 动态控制的唯一推荐方式
用 setAttribute('disabled', 'disabled') 或 removeAttribute('disabled') 容易出兼容问题,尤其在旧版 Safari 或某些 React/Vue 渲染场景下可能失效或状态不同步。正确做法是直接操作 DOM 属性:
-
inputEl.disabled = true—— 禁用,可靠、语义清晰、触发浏览器原生行为 -
inputEl.disabled = false—— 启用,注意必须显式设为false,不能只删属性 - 检查状态直接用
if (inputEl.disabled),返回布尔值,不是字符串
禁用后字段值不会出现在 FormData 或表单提交中
这是最常被忽略的业务影响点:后端收不到这个字段的任何值,哪怕它有 value 属性或用户之前输过内容。如果你需要“显示但不可改 + 后端必须收到值”,disabled 就错了,该换方案:
- 对
<input type="text">或<textarea>,用readonly(但注意它不适用于select、checkbox、radio) - 对
select或复选框组,只能用disabled,再额外加一个<input type="hidden">提交原始值 - 千万别用
readonly代替disabled来“防改”,否则用户能 Tab 进去、复制粘贴、甚至用 DevTools 改值后提交
fieldset 上设 disabled 可批量禁用子控件,但有继承边界
把一组 <input>、<select> 包进 <fieldset disabled>,是最简洁的批量方案,浏览器会自动递归禁用所有直属子表单控件(包括嵌套的 <fieldset>)。但要注意:
立即学习“前端免费学习笔记(深入)”;
- 子元素显式写了
disabled不会覆盖父级禁用,但若子元素加了disabled="false",现代浏览器仍以父级为准 -
<legend>文字不受影响,仍可聚焦、可读取;如需一并屏蔽,得额外加 CSS 或 JS - 如果中间插了个
<div>再包控件,fieldset的禁用就断了——它只作用于直属子元素 - IE11 对
fieldset disabled的默认样式支持不稳定,建议用fieldset:disabled input这类选择器微调,别用opacity遮盖
disabled,而是禁用后焦点没移走、验证状态残留、或者后端突然收不到关键字段——这些细节一旦漏掉,测试时很难复现,上线后才爆。



















