只有同时满足严格条件的属性值可不加引号:仅含ASCII字母、数字、下划线、短横线、冒号、点,非空,无空格/等号/引号/小于号/反引号,且非style或on*类属性;但强烈建议始终加双引号以避免解析错误、工具报错及协作问题。
多数情况下,HTML 属性值都必须使用引号;虽然存在少量免引号情形,但省略引号并非随意选择,只有严格满足规定条件才属于合法写法。
只有在下列条件全部同时成立时,value 才可以不写引号:
_)、短横线(-)、冒号(:)、点(.)class= 或 id=))、大于号(<code>>)、反引号(`)style、on* 事件处理器等解析敏感属性例如:<div class=header id=my-section data-id=123> 是合法的;但 <div class=main header>(含空格)或 <input value=John's age>(含单引号)会直接解析失败或截断。
省略引号似乎更省事,实际上会带来多种隐患:
立即学习“前端免费学习笔记(深入)”;
<a href=/path?k=v&w=x> 可能错误地被截断成 k=v(& 被识别为属性分隔符)<button onclick=doSomething(1, 'yes')> 几乎一定会出错)class 与 data-* 属性经常出现的错误写法这两种属性最容易因为侥幸而省略引号,同时也最容易出问题:
class=card featured → 写法合法却存在风险:一旦后续加入空格或变量(例如 class=card {{ modifier }}),模板渲染时就会直接崩溃data-id=abc-123 → 属于合法写法;不过 [email protected] 中的 @ 不属于白名单字符,因此必须改写为 data-user-id="[email protected]"
data-json={"a":1} → 完全不合法:大括号、冒号和引号均违反规则,必须先转义再包裹:data-json='{"a":1}' 或 data-json="{"a":1}"
统一采用双引号(")可以把认知负担降到最低,原因包括:
title="Don't click" 相较于 title='Don't click' 更加直观)$title = 'He said "Hi"';),则改用单引号包裹属性:title='= $title ?>'
当你开始纠结“是否需要引号”时,往往已经接近解析器容错的边界;与其反复查规范,直接添加引号通常更快。