不带引号的HTML属性?

11

我一直认为HTML的属性值都需要使用引号:

<div class="service_definition"> 或者 <div class='service_definition'>

但是最近我发现w3验证器并不把以下代码当作错误:

<div class=service_definition>

那么如果我省略引号,这样做是否正确?或者有什么限制吗?


请注意,如果您使用xhtml,则必须始终使用引号。请参阅xhtml与html4的差异 - PhoneixS
HTML的哪个版本? - Joe Phillips
5个回答

20

始终使用引号。

我认为没有使用引号的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">

这清楚地向浏览器展示了我的类是classaclassb,并且元素ID为123

去掉引号后,我们得到:

<div class=classa classb id=123>
一个浏览器现在可以将其解释为3个类,没有id。 classaclassbid=123
或者它甚至可以将其解释为3个属性。 class="classa"classb=""id="123" (即使是stackoverflow的语法样式也很难处理这个问题!)

1
所以这是验证器的一个错误? - Shylux
4
<div class=classa classb id=123> - I believe the browser will interpret it as 3 attributes, class="classa", classb="" and id="123" - rickyduck
SO的代码着色完美无误:classb是一个布尔属性,而另外两个则是只有一个值的属性。http://www.w3.org/TR/html-markup/syntax.html#syntax-attributes - deceze
@deceze 你是根据什么来点踩的?还是这只是巧合? - Curtis
2
总的来说,你的答案并不正确。引用和未引用属性的行为是非常明确的,没有歧义。如果你正在动态创建 HTML 并且可能会遇到像 classb 示例这样的情况,那么加上引号是个好主意。但是,如果你手工编写一些 HTML,则可以毫无问题地将它们省略掉。 - deceze
显示剩余4条评论

10

规则取决于 HTML 版本。

在所有的 XHTML 变体中,属性值必须始终使用引号括起来,因为 XHTML 是 XML。验证器会自然地检查这一点。但在浏览器实践中,情况不同。在真正的 XML 模式下,如果缺少引号,则会中止文档解释:内容不会显示,仅向用户显示错误消息(其中可能包含源代码片段)。但是当 XHTML 作为 HTML 服务时,这是正常方式(尤其是由于旧版本的 IE 不懂 XHTML),浏览器会根据 HTML 规则处理它。

否则,在 HTML 中,正式规则因规范而异,但浏览器接受无引号的属性值。HTML5 草案反映了这种自由态度:只有当值包含空格、换行符、重音符号 (`)、等号 (=)、小于号 (<)、大于号 (>)、Ascii 引号 (") 或 Ascii 撇号 (') 时才需要引号。

实际上应该根据惯例来处理,这应该取决于与您的代码相关的同事或其他人的意见,而不是公众舆论。许多人认为 XHTML 的限制语法很酷。其他人可能认为不必要的引号会弄乱代码并带来一些风险:每当您需要使用一些成对的字符时,总是有遗忘关闭组件或打错字的机会。


6

如果属性值仅由以下字符组成(参见名称的技术概念),则可以省略属性值中的引号:

letters of the English alphabet (A to Z, a to z)
digits (0 to 9)
periods .
hyphens -

因此,WIDTH=80和ALIGN=CENTER是WIDTH="80"和ALIGN="CENTER"的合法缩写。像HREF=foo.html这样对URL的引用是可以接受的,但通常情况下在属性中使用URL时必须加引号,例如HREF="http://www.hut.fi/"。- 有些浏览器容错性更强。一些浏览器甚至会接受以起始引号开头但没有任何结束引号的元素。这种用法是非常不好的做法。
参考http://www.cs.tut.fi/~jkorpela/HTML3.2/3.4.html

1
有时候,您可以在不使用引号的情况下使用 HTML 属性。
最近我在 SharePoint 中创建了一个文本文档,其中链接到了公司的 Web 应用程序。当使用 href 值(网站 URL)时,我收到了一个错误消息,因为使用了引号,这在技术上是正确的。
我注意到在 DOM 中,浏览器会自动添加一组引号到 href 值中。因此,我尝试着在没有引号的情况下输入 href 值,这样就修复了导航错误。

0

对我来说,w3验证器显示它是一个错误:

An attribute value specification must be an attribute value literal unless SHORTTAG YES is specified.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接