我一直认为HTML的属性值都需要使用引号:
<div class="service_definition">
或者 <div class='service_definition'>
但是最近我发现w3验证器并不把以下代码当作错误:
<div class=service_definition>
那么如果我省略引号,这样做是否正确?或者有什么限制吗?
我一直认为HTML的属性值都需要使用引号:
<div class="service_definition">
或者 <div class='service_definition'>
但是最近我发现w3验证器并不把以下代码当作错误:
<div class=service_definition>
那么如果我省略引号,这样做是否正确?或者有什么限制吗?
始终使用引号。
我认为没有使用引号的HTML属性不属于无效的HTML,但它们可能会在后续的过程中导致问题。
默认情况下,SGML要求使用双引号(ASCII十进制34)或单引号(ASCII十进制39)将所有属性值括起来。当以双引号为分隔符括起属性值时,可以在属性值中包含单引号,反之亦然。作者还可以使用数字符号引用表示双引号(")和单引号(')。对于双引号,作者还可以使用字符实体引用"。
在某些情况下,作者可以指定一个没有引号的属性值。属性值只能包含字母(a-z和A-Z)、数字(0-9)、连字符(ASCII十进制45)、句点(ASCII十进制46)、下划线(ASCII十进制95)和冒号(ASCII十进制58)。即使可以省略引号,我们仍建议使用引号。
来源:http://www.w3.org/TR/REC-html40/intro/sgmltut.html#h-3.2.2
我认为引号是清晰地定义属性值开始和结束的好方式。
例如,class
属性可以有多个用空格分隔的类:
<div class="classa classb" id="123">
这清楚地向浏览器展示了我的类是classa
和classb
,并且元素ID为123
。
去掉引号后,我们得到:
<div class=classa classb id=123>
一个浏览器现在可以将其解释为3个类,没有id。 classa
、classb
和 id=123
。class="classa"
、classb=""
和 id="123"
(即使是stackoverflow的语法样式也很难处理这个问题!)<div class=classa classb id=123>
- I believe the browser will interpret it as 3 attributes, class="classa"
, classb=""
and id="123"
- rickyduckclassb
是一个布尔属性,而另外两个则是只有一个值的属性。http://www.w3.org/TR/html-markup/syntax.html#syntax-attributes - decezeclassb
示例这样的情况,那么加上引号是个好主意。但是,如果你手工编写一些 HTML,则可以毫无问题地将它们省略掉。 - deceze规则取决于 HTML 版本。
在所有的 XHTML 变体中,属性值必须始终使用引号括起来,因为 XHTML 是 XML。验证器会自然地检查这一点。但在浏览器实践中,情况不同。在真正的 XML 模式下,如果缺少引号,则会中止文档解释:内容不会显示,仅向用户显示错误消息(其中可能包含源代码片段)。但是当 XHTML 作为 HTML 服务时,这是正常方式(尤其是由于旧版本的 IE 不懂 XHTML),浏览器会根据 HTML 规则处理它。
否则,在 HTML 中,正式规则因规范而异,但浏览器接受无引号的属性值。HTML5 草案反映了这种自由态度:只有当值包含空格、换行符、重音符号 (`)、等号 (=)、小于号 (<)、大于号 (>)、Ascii 引号 (") 或 Ascii 撇号 (') 时才需要引号。
实际上应该根据惯例来处理,这应该取决于与您的代码相关的同事或其他人的意见,而不是公众舆论。许多人认为 XHTML 的限制语法很酷。其他人可能认为不必要的引号会弄乱代码并带来一些风险:每当您需要使用一些成对的字符时,总是有遗忘关闭组件或打错字的机会。
如果属性值仅由以下字符组成(参见名称的技术概念),则可以省略属性值中的引号:
letters of the English alphabet (A to Z, a to z)
digits (0 to 9)
periods .
hyphens -
对我来说,w3验证器显示它是一个错误:
An attribute value specification must be an attribute value literal unless SHORTTAG YES is specified.