布尔属性合法写法仅有disabled或disabled="",disabled="false"等无效;JS应使用el.disabled=true而非setAttribute;autocomplete等属性有值约束,错误写法会被静默丢弃。

浏览器只认“存在即 true”,disabled、checked、required 这类布尔属性写成 disabled="false" 或 required="" 就等于没写,解析器直接跳过——这不是兼容性问题,是规范行为。
布尔属性的合法写法只有两种形式
HTML 解析器不关心值的内容,只检查属性名是否出现。只要标签里有这个属性名,就视为启用;没有,就是禁用。
-
disabled(最干净,推荐) -
disabled=""(空字符串,兼容旧解析器,但语义冗余) -
禁止:
disabled="false"、disabled="0"、disabled="disabled"—— 这些都会被当成普通字符串属性,不触发布尔逻辑
JS 动态控制时别混用 setAttribute 和属性赋值
DOM 属性和 HTML 属性不是一回事。用 setAttribute('disabled', '') 只是往 HTML 字符串里塞了个空值,但不会同步更新 DOM 的 disabled 布尔状态;而 el.disabled = true 直接操作 DOM 属性,实时生效。
- 初始渲染靠 HTML 写法:
<input required> - 运行时控制靠 JS 赋值:
el.required = false,不是el.setAttribute('required', '') - 读取状态也应查 DOM 属性:
if (el.checked) { ... },而非el.hasAttribute('checked')(后者只反映 HTML 源码是否写了该属性)
常见误判:autocomplete、defer、muted 看似布尔,实则部分受限
有些属性名字像布尔属性,但实际有严格值约束或上下文依赖,解析器会按规则过滤掉非法写法。
立即学习“前端免费学习笔记(深入)”;
-
autocomplete="Email"无效:不是大小写问题,是Email不在 WHATWG 白名单里,整个属性被静默丢弃 -
defer只对带src的<script>生效;写在内联脚本上(<script>console.log(1)</script>)会被忽略 -
muted在<video>上有效,在<audio>上也有效,但若同时设volume="0",部分浏览器仍可能触发音量控件显示
最容易被忽略的是:布尔属性一旦写错值,浏览器不会报错、不发警告、也不留痕迹——它只是安静地当那行 HTML 不存在。调试时别只看页面表现,务必打开开发者工具 Elements 面板,盯着实际解析出的属性列表看。



















