HTML5是否会更改HTML注释的标准?


131

最近,我发现HTML5中可能存在一种新的注释方式。

取而代之的是典型的<!-- -->多行留言我已经知道了,我我发现我的IDE做了一个常规<!div >注释。因此,我对其进行了测试,令我惊讶的是Chrome浏览器将该标签注释掉了。它注释掉了标签,而不注释了div的内容,因此我不得不注释更近<!/div>,以免关闭其他div。

我测试了另一个,看来通常在任何标签(该符号)的开头放置一个感叹号<,使该标签被注释掉。

这是真的吗?这是不好的做法吗?它实际上很方便,但是是否实用(如果不是新的)?

编辑额外的细节: 虽然这个特殊语法的语法错误或误解是一个很好的理由,为什么铬实际上使他们作为正式的意见?

该代码写为

<!div displayed> some text here that is still displayed <!/div>

然后将其呈现为

<!--div displayed--> some text here that is still displayed <!--/div-->

19
它更有可能只是语法错误和/或废话标记,因此被忽略。
deceze

@deceze我有点期望,因为浏览器可以根据不太严格的规则宽容HTML的方式。
安德鲁(Andrew)

1
@ Lemony-Andrew那是什么IDE?根据选定的答案,我们可以将其报告为问题(如果是开源的,则可以解决)。
Dereckson

1
@Derecksonit在做出正式答复后,我再次检查了我的IDE,以确保我的眼睛没有欺骗我。碰巧它实际上并没有被注释掉,而是类似的常规文本颜色。这全是偶然的。
安德鲁

Answers:


196

HTML5中没有新的注释标准。唯一有效的注释语法为still <!-- -->。从W3C HTML5的8.1.6节开始

注释必须以以下四个字符序列开头:U + 003C小于号,U + 0021感叹号,U + 002D HYPHEN-MINUS,U + 002D HYPHEN-MINUS(<!--)。

<!语法源自SGML DTD标记,它不是HTML5的一部分。在HTML5中,它保留用于注释,CDATA部分和DOCTYPE声明。因此,这种选择是否是不好的做法,取决于您是否认为使用(或更糟的是,依赖)过时的标记是不好的做法。

Validator.nu称您有“虚假评论”。—这意味着即使它不是有效的评论,也将其视为评论。据推测,这是为了与基于SGML的HTML5之前的版本向后兼容,并且具有采用形式的标记声明<!FOO>,因此我不会称之为新的。他们正在处理的原因类似意见是因为SGML的标记声明并不意味着要呈现的特殊声明,但由于它们是无意义的HTML5(上述例外),至于HTML5 DOM而言,他们无非评论。

根据第8.2.4节中的以下步骤得出此结论,Chrome似乎紧随其后:

  1. 8.2.4.1数据状态

    消耗下一个输入字符:

    “ <”(U + 003C)
    切换到标签打开状态。

  2. 8.2.4.8标签打开状态

    消耗下一个输入字符:

    “!” (U + 0021)
    切换到标记声明打开状态。

  3. 8.2.4.45标记声明打开状态

    如果接下来的两个字符均为“-”(U + 002D)字符,则使用这两个字符,创建一个注释令牌,其数据为空字符串,然后切换到注释开始状态。

    否则,如果接下来的七个字符是单词“ DOCTYPE”的ASCII不区分大小写的匹配项,则使用这些字符并切换到DOCTYPE状态。

    否则,如果当前节点已调整,并且不是HTML命名空间中的元素,并且接下来的七个字符是区分大小写的字符串“ [CDATA [”(五个大写字母“ CDATA”,U + 005B LEFT SQUARE BRACKET字符之前和之后),然后使用这些字符并切换到CDATA部分状态。

    否则,这是一个解析错误。切换到假评论状态。使用的下一个字符(如果有)是注释中的第一个字符。

    注意,它说仅当遇到的字符序列为时才切换到注释开始状态<!--,否则为假注释。这反映了以上第8.1.6节中所述。

  4. 8.2.4.44虚假评论状态

    消费每个字符,直到并包括第一个“>”(U + 003E)字符或文件结尾(EOF),以先到者为准。发出一个注释令牌,其数据是从导致状态机切换到伪注释状态的所有字符开始(包括该字符)的串联,直到最后一个消费字符之前的字符(包括该字符)在U + 003E或EOF字符之前),但所有U + 0000 NULL字符都被U + FFFD REPLACEMENT CHARACTER字符替换。(如果注释在文件(EOF)的末尾开始,则标记为空。类似地,如果标记是由字符串“ <!>” 生成的,则标记为空。)

    用简单的英语,这轮流<!div displayed><!--div displayed--><!/div><!--/div-->,完全按照问题描述。

最后,您可能会期望其他符合HTML5的解析器的行为与Chrome相同。


11
感谢您抽出宝贵时间找到此事件背后的官方理由。它使事情变得相当清楚,并为我的错误假设提供了很多依据。
安德鲁

2
HTML5规范具有处理“无效”内容的规则,这很奇怪。如果无效,则根本不应该对其进行处理。
Arturo

2
好吧,这就是HTML和Web语言过去的严格要求。宽松处理代码结构的原因是为了获得更好的质量。浏览器可以浏览的网站越多,用错误的语法正确地浏览,他们的最终用户就会越高兴。通用的Web标准编写者(大多是w3而不是其他人)意识到,浏览器供应商因此没有遵循准则。HTML5的出现只是建立在使设计正式更宽松的想法上。
安德鲁

3
@ArturoTorresSánchez:XHTML尝试了“无效内容=错误”方法,但失败了。此外,规则基本上说“不要解析此伪造的注释,只需将其视为注释并解析下一个发现的有效内容”。因此,根据您的观点,HTML5可能不会执行您想要的操作,因为您想要的内容很糟糕,或者HTML5确实执行了您想要的操作。
slebetman

1
@ArturoTorresSánchez:从历史上看,HTML服务器期望为任何类型的浏览器提供相同的字符序列。尽管可以通过以下方式设计文档格式:较旧的解析器将能够区分使用较旧的解析器应忽略的“可选”较新功能的文档,使用重要的较新功能且应被不支持此功能的浏览器拒绝的文档不能支持它们,而文档完全是无效的,在HTML的形成年代就没有做到这一点。
supercat 2015年

12

我不认为这是一个好习惯,因为它<!代表的标记声明<!DOCTYPE。因此,您认为它已被注释(嗯...浏览器将尝试对其进行解释)。

即使没有出现,这似乎也不是注释HTML代码的正确语法。


虽然这可能是正确的,但Chrome为何实际上将那些标记注释掉了,但是现在是doctype。
安德鲁

4
建议(我不确定,只是猜测):尝试解释>不能>发表评论?
伊夫·兰格

在我看来,这足够合理。
安德鲁

再次(很抱歉坚持),但是请注意,这只是一个假设!
伊夫·兰格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.