在 HTML(4、5,无论哪个版本)中,为属性值加引号是可选的,有点像。 以下两种写法完全没问题
<b class=boom>
<b class="boom">
但存在规则和限制。 希望显而易见,这存在问题
<a title=Hi, mom! href=#>
Hi, mom!
中的空格是问题所在。 浏览器会将属性值的 Hi,
视为属性值,并将 mom!
视为一个独立的属性。 任何类似空格的字符都会导致此问题。 Mathias Bynens 创建了一个名为 Mother-effin’ unquoted attribute value validator 的工具,这是一个简单工具,用于评估可能的属性值,查看其是否有效。
问题字符有:空格、制表符、换行符、换页符、回车符、“、’、`、=、< 或 >。
实际问题
所以,这些是规则,但是如果您实际违反了这些规则会发生什么? 在未加引号的属性中使用其中一些字符会导致严重问题。 其他字符则不会。 有些未在这些规则中提到的字符会导致问题。
让我们看看其中的一些。
<div rel></div>
<div rel=></div>
无效,但在任何浏览器中都不是什么大问题。 浏览器只是将 rel 属性视为存在,但为空。
<div rel==></div>
无效,但在所有浏览器中都能正常工作。 Rel 属性被视为“=”。
<div rel=&></div>
Rel 值在所有现代浏览器(包括 IE 9 和 10)中被视为“&”。 IE 6、7 和 8 看到空值,除非通过 CSS 访问(例如 content: attr(rel);
),在这种情况下,该值被视为“&”。
<div rel=&a></div>
Rel 值在所有现代浏览器(包括 IE 9 和 10)中被视为“&a”。 IE 6、7 和 8 将该值视为“a”。
<div rel=a&b></div>
Rel 值在所有现代浏览器(包括 IE 9 和 10)中被视为“a&b”。 IE 6、7 和 8 将该值视为“a”。
<div rel=a&b></div>
在本例中,与符号被编码。 包括 IE 9 和 10 在内的现代浏览器将该值视为“a&b”(与未编码相同)。 IE 6、7 和 8 的行为与上次测试相同,将该值截断为仅“a”。
IE 6、7 和 8 似乎对属性值中的与符号并不担心,但会在它们第一次看到与符号的地方截断该值(除非以与符号开头,否则所有后续字符直到下一个与符号都会被截断)。
<div rel=`></div>
所有版本的 IE(甚至包括 10)在这里都会出现问题。 它们将反引号字符视为引号,因此,只使用其中一个反引号,就相当于文档中其余部分直到下一个引号都是属性值的一部分。 所有其他浏览器都没有问题,将该值视为“`”。
<div rel=```></div>
这同样存在问题,因为反引号数量为奇数,它会使一组引号处于打开状态。 所有非 IE 浏览器都将该值视为““`”。
<div rel=``></div>
这问题略小一些,因为 IE 所视为的引号已关闭。 非 IE 浏览器将该值视为““”。
<div rel=<></div>
包括 IE 9 和 10 在内的现代浏览器将 rel 属性值视为“<”。 IE 6 和 7 将该值视为空白,但不会出现重大灾难。 IE 8 通过 JavaScript 将该值视为空白,但通过 CSS 将该值视为“<” (例如 content: attr(rel);
)。
<div rel=>></div>
这里,我们试图将该值设置为“>”,但实际上,我们创建了一个带有实际“>”的 div。 另一种查看方法是
<div rel=>
>
</div>
在所有浏览器中,rel 属性将为空。
<div rel={@#():,*!![[]]}></div>
这看起来很奇怪,但这些字符中没有一个是存在问题的,并且没有哪个浏览器对此有任何问题。
<div rel='></div>
<div rel="></div>
这在所有浏览器(单引号或奇数引号)中都是存在问题的。 与反引号的情况类似,只是所有浏览器都理解引号和引号。 这是一个灾难性的问题,因为文档中其余部分直到下一个引号都会被视为该属性的值。
在本文中,“现代浏览器”通常指 Safari 5.0、Firefox 4、Chrome 12 和 Opera 11。 IE 通常按版本列出。“所有浏览器”是指我列出的现代浏览器加上 IE 6-10。 我用于测试的一些内容位于 这个 Pen 中,可以根据需要轻松修改以进行更多测试。 没有使用任何 JS 库。
另请参阅 Mathias 的 深入文章,该文章还涵盖了在 CSS 中使用它们的方法。
结论:如果您对上述内容感到困惑,请为所有属性加上引号。
我发现始终为所有属性加上引号(XML 风格)是最好的做法。 XHTML 很多方面都做对了,很可惜 HTML5 没有继承更多方面,例如必须关闭所有标记,无论是自闭合标记还是打开和关闭标记。
完全同意。 我在 HTML5 中一直以这种方式编码,即关闭所有标记,并始终为属性加上引号。
顺便说一句,我一直使用“双引号”表示 HTML,使用“单引号”表示 JavaScript。
我完全同意,虽然我很享受这种随意性,但 XHTML 标记关闭的整洁性让我感觉非常高效和安全。
这更多是懒惰而不是风格。 自律并为属性加上引号。 这会让你 :)。
绝对同意 Jamie、Carlos、Thomas 和 Andy 的观点!
为什么一个做过 XHTML 工作的人会选择不为属性加上引号,或保留未关闭的标记?
事实上,我不理解这篇文章的意义所在。 在创建 HTML 页面时,这些问题总是会被解决的。
总之,这仅仅是我的观点,那些保留未加引号内容的人可能对此文章有所帮助!
绝对的。 很可惜 HTML5 规范中没有要求始终为属性加上引号。 认为这只是一个编码风格问题的说法似乎有点牵强,因为规范存在的意义就是为了规定这些东西。
感觉这像是倒退回了 10 年前的代码,这种代码仍然困扰着互联网。
我也是这么想的。 但是,OWASP XSS 阻止策略清单 仍然将大多数这些字符列为在未加引号的属性值中存在危险的字符。
坦白地说,我不信。 我希望他们提供更多信息(例如,他们指的是哪些浏览器?),或者提供类似演示的东西,因为我很想被证明是错的。
对任何属性使用双引号都是良好的做法。 单引号在某些语言中速度会慢一些,如果您需要在引号中使用引号,则可以对其进行转义或编码。
呃,你不能一概而论。 有时单引号和双引号相同,有时不同,当它们不同时,哪个是哪个很难说。 Bash/shell 脚本在不同地方的使用会影响很多方面,例如单词拆分以及是否解释转义字符。 在 Haskell 和 ML 家族中,它们的区别在于字符和字符串字面量。 在 Python 中,这并不重要,除了像大多数其他语言一样,您可以使用单引号和双引号嵌套,而不是进行转义。
总之,很难根据其他语言的做法对引号的使用方式做出合理的论证。 当然,不能说速度有什么差别。 从技术上讲,单引号在那些对内容不做进一步处理的语言中速度(微不足道地)更快。
所以,为什么要费心? 为所有属性加上引号不是更简单、更安全吗?
是的,我一直使用引号和结束标记,这样更容易管理和跟踪代码、阅读代码,还能确保不会出现神秘问题。 我想,破坏它并准确了解它是如何被破坏的,确实是一种我以前没有的知识,但我不认为很快就会出现这种情况。
答案:为你的属性加上引号。 这更简单,不会出现问题,不会给解析器造成问题,看起来也更好。
虽然很有趣,但我不知道这是否与如今的网页开发相关……现在每个人都为属性加上引号,对吧?
绝对同意你的观点,Andrew!
HTML 中空格之所以重要,是因为它是用于缩写布尔属性的分隔符。
http://www.whatwg.org/specs/web-apps/current-work/#boolean-attributes
XHTML 实际上没有这些。例如,如果你想使用 XML 语法定义一个带有启用控件的视频元素,则需要使用空字符串值。
vs
否则,我完全同意其他发帖者的观点——我个人就是以 XML 的方式进行操作。
我说,引用,引用,引用...一直引用。
我在 XHTML 中学到的东西在 HTML5 中使用起来很酷。
引用所有内容,正确关闭标签...99% 的问题都解决了 :)
同意 Jamie!
正如你指出的,大多数浏览器会尝试解析开发人员编写的任何内容,无论他们的代码是否正确。但这并不是开发人员开始以这种方式编码的借口。
还记得几年前 HTML 4.01 的编码混乱吗?我们不希望它再次发生,是吗?
稍微偏离主题:松散语法是 HTML5 最大的弊端之一(尽管许多人认为能够采用自己的编码风格是一件好事),让我们希望它不会成为灾难。不会有新的“XHTML”来拯救我们。
+1 to Spyros .. couldn't have said it better – coding chaos = tag soup
浏览器总是会原谅,但你让它们更容易解析,你的代码就越有可能与更新的库和微格式一起使用 == Chris 说的那样
“如果你对其中任何内容感到困惑,只需引用所有属性。”
> 如果你对其中任何内容感到困惑,只需引用所有属性。
项目很少是一个人的表演,因此我认为应该重新表述为“始终引用所有属性,因为这可能会令人困惑(对你或其他人)”。
更好的是,将其重新表述为“始终引用所有属性”。
你记住的“规则”越少越好。
只需引用你无法控制的任何属性,例如 CMS 输入的值。
好吧,我目前正在从 XHTML Strict 迁移到 HTML5。我完全打算在我的所有编码中继续使用相同的“严格”标准——仅仅是因为我相信这是最佳实践。此外,它已经成为习惯:)。
干杯
我
嗯,有趣。但正如之前有人指出的那样,谁实际上不使用引号?
用括号括起来的属性值有什么区别?例如:background:url(myimage.png) no-repeat 0 0;
以及:background:url("myimage.png") no-repeat 0 0;
据我所知,这没有任何区别。你同意吗?
我更喜欢使用引号,原因很简单:彩色代码(在我的 InType 代码中不使用引号就无法正常工作)。
你的最终文档中有多少个引号?也许不使用它们是值得的。我开始在 ID 和类名称中不再使用它,但在两个或多个值的单词中保留它们。
拜托,谁会用这些奇怪的符号来给你的标签中的东西命名?
如果有人这样做,在考虑是否引用之前,还有很多事情需要担心。
干杯!
我同意 Scott 和 Frank 的观点,为了安全起见,“始终引用所有属性”。