CSS块中存在未闭合引号

9
这段代码在Firefox上是红色的,在Chrome上是蓝色的。谁是正确的?

* { background: red; '}
* { background: blue; }

§4.1.6 块中说:

单引号(')和双引号(")也必须成对出现,它们之间的字符被解析为字符串。

但是如果'"没有成对出现,应该如何处理语法错误?


1
我会投Chrome一票,因为红色块是唯一有未匹配引号的,但这只是我的看法。 - Danny
我更喜欢Chrome处理这个的方式,但我不确定Chrome或Firefox哪一个是“正确”的 - 相反,我认为css只是错误的。 - TheLeggett
@TheLeggett 是的,CSS是错误的,不应该被使用。我只是好奇规范定义了在这些情况下应该发生什么。 - Oriol
1
Chrome 53已经修复了该漏洞,现在是红色的。 - Oriol
很遗憾...我认为Chrome的行为更有帮助,即使出现错误,也会尽可能地挽救CSS,而Firefox则会直接丢弃它。 - Septagram
2个回答

4
根据我对4.2解析错误的理解,以及所谓的“匹配对规则”,该结构应如下所示:
* { background: red; '}
* { background: blue; }

应该这样阅读:
* { background: red; ...<EOF> }

也就是说,在'}后面的文件中的所有内容都将被丢弃,因为在该行中没有匹配的}(因为在看到另一个}之前总会先有另一个{),因此它将在文件末尾隐式关闭。当然,这真的很复杂,所以我可能是错的...
通过CSS21语法的进一步阅读似乎证实了这一点。基本上,这里有两个影响:
1.未匹配的'将导致忽略当前行的所有内容。
2.未匹配的{将导致将文件末尾的所有内容解析为仍然是同一声明块的一部分。
所以基本上,#1 导致闭合的} 消失了。#2 可能会导致其后的所有内容丢失,因为它无法作为带有块的有效声明进行解析(因为{..}嵌套计数总是错误的)。

1

虽然Chrome在不抱怨的情况下忽略该行,但Firefox会停止进一步处理CSS并记录警告(至少适用于Mac OS X Yosemite上的Chrome 41.0.2和FF 36.0.1):

找到未关闭的字符串''}'. 预期声明但找到''}'. 跳过到下一个声明。

尽管警告说跳过到下一个声明。,但在我的情况下,FF实际上并没有这样做(在提供的代码之前和之后添加了一些CSS)。

在我看来,这两种情况都不是很好的解决方案,因为现在网络在很大程度上依赖于CSS,所以浏览器既不应忽略语法错误,也不应完全停止处理CSS。

我知道问题中没有提到Safari,而且我也不是它的铁杆粉丝,但它所做的是:记录警告,跳过该行并处理文件的其余部分。这就是我所期望的。

这只是我的个人意见。


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