84

我很确定<![CDATA[...]]>部分可以在 XHTML5 中使用,但是 HTML5 呢?

4

5 回答 5

59

CDATA结构根本不是针对 HTML 的,而是针对 XML 的。

人们有时在 XHTML 内部script标签中使用它们,因为它消除了它们对转义<,>&字符的需要。但是在 HTML 中是不必要的,因为scriptHTML 中的标签已经像 CDATA 部分一样被解析。

编辑:这是我们从 2002 年开始打开真正发霉的旧蠕虫罐的地方,无论您是按照“应该”发送 XHTMLtext/html还是发送 XHTML 到 :-)application/xhtml+xml

于 2010-07-21T18:48:33.943 回答
25

从同一页面@pst 链接到

元素特定的解析scriptstyle标签XHTML-HTML 兼容性指南:“以下带有转义的代码可以确保脚本和样式元素在 XHTML 和 HTML 中都可以工作,包括旧版浏览器。”

最大的向后兼容性:

<script type="text/javascript"><!--//--><![CDATA[//><!--
    ...
//--><!]]></script>

更简单的版本,有点与“更旧的浏览器”不兼容:

<script>//<![CDATA[
   ...
//]]></script>

因此,CDATA可以在 HTML5 中使用,并且在XHTML-HTML 兼容性官方指南中推荐。

这对于多语言HTML/XML/XHTML 页面很有用,这些页面在开发过程中作为严格的application/xmlXML 提供,但在生产模式下作为text/htmlHTML5 提供,以获得更好的跨浏览器兼容性。多语言页面有它们的好处;我自己使用过它,因为它更容易调试 XML/XHTML5。例如,Google Chrome 会针对无效的 XML/XHTML5(包括例如字符转义)抛出错误,而作为 HTML5 提供的同一页面将“正常工作”,也称为“可能工作”。

于 2012-07-13T00:25:28.930 回答
17

该规范似乎解决了这个问题。script 和 style 标签被认为是“原始文本元素”。他们不需要或不允许使用 CDATA。CDATA 仅用于“外来内容”——即 MathML 和 SVG。请注意,脚本标签中可以包含的内容有一些限制——基本上你不能var x = '</script>'在里面放类似的东西,因为它会关闭标签并且需要像他的回答中提到的 pst 那样拆分。http://www.w3.org/TR/html5/syntax.html#cdata-rcdata-restrictions

于 2010-12-19T20:05:35.297 回答
7

支持 HTML5 的浏览器已经读取了里面的内容<style><script>标记为 CDATA(字符数据)。这意味着您通常不需要HTML5 浏览器的这些元素中添加 CDATA 标记,因为它们可以解析 CSS 和 JavaScript,但也会忽略任何标记字符。示例:这些标签之间的 HTML 注释(<!---->)将被忽略。

<style><script>但是...如果您希望 HTML5 页面与不将这些标签读取为 CDATA的 XHTML 和 XML 兼容,您确实需要在内部添加 CDATA 块和HTML5 标签。出于这个原因,我建议您在 HTML5 中使用 CDATA,但请继续阅读...

XML 和 XHTML 解析器会像处理所有 HTML 元素一样读取<style><script>标记内容,作为 PCDATA(即普通的 HTML 元素),这意味着内容被解析为标记,并且可能会因在这些标记之间添加特殊字符而中断。您可以在这两个标签之间添加特殊的 CDATA 部分来支持它。因为 XML 和 XHTML 解析器将元素内的所有内容都作为潜在的更多标记来读取,所以添加 CDATA 可以防止某些字符被解释为 XML 或其他类型的字符引用。

问题是,大多数 HTML4/HTML5 浏览器和解析器不支持在这些标记之间添加额外的 CDATA 部分,因此如果为 XHTML/XML 支持添加这些代理,则必须为这些代理注释掉 CDATA 块。

另外,请注意,在这些标记中添加的所有 HTML 注释 (<!---->) 都会被 HTML 解析器忽略,而是由 XHTML 实现,在添加时注释掉用于 XHTML 的 CSS 和 JavaScript。过去,许多人会在这些标签之间添加注释规则,以隐藏通常无法理解 CSS 或 Javascript 的非常旧的浏览器(1998 年之前的浏览器)的样式和脚本。但是在没有额外代码的情况下,该策略在 XHTML 中失败了。

那么,您如何将所有这些内容<style><script>标签结合起来,您应该关心吗?

我是一个纯粹主义者,并且喜欢我的HTML5内容仍然是XML/XHTML 友好的,无论我使用什么标记建议。我也喜欢我的页面在知道 CSS 的浏览器和不知道 CSS 的旧浏览器中工作。所以这里有两种解决方案来支持所有这些场景,并且仍然在现代浏览器中显示您的样式和脚本而不会出错。在现代 HTML5 浏览器中使用它们是完全安全的

风格

<style type="text/css">
    <!--/*--><![CDATA[/*><!--*/

    /* put your styles here */

    /*]]>*/-->
</style>

脚本

<script type="text/javascript">
    <!--//--><![CDATA[//><!--

    // put your scripts here

    //--><!]]>
</script>
  • 这两个代码块将允许 HTML5 浏览器正常使用 CSS 和 JavaScript,但对不支持这些技术的旧浏览器隐藏它们。

  • XHTML 浏览器现在将像以前一样解析您的 CSS 和 JavaScript,但不允许像<,>和等特殊字符&被解释为会产生解析错误的标记或实体/转义字符。他们现在是 CDATA。

  • 当然,您页面的 XML 解析器不会理解您的 CSS 和 JavaScript,但会接受您在其中添加的任何类型的文本,并且不会尝试将它们解析为标记。他们现在是 CDATA。

  • 示例是如何工作的:对于现代支持 HTML5 的浏览器,注释标记<!---->内部scriptstyle标签默认情况下被视为内部stylescript元素的 CDATA,因此被完全忽略。之后,CSS 和脚本注释将 CSS 和脚本注释中的其余顶行和底行包裹起来,因此被删除。这意味着在较新的 HTML5 浏览器中,顶行和底行总是被安全地隐藏和忽略。不了解脚本或 CSS 的旧浏览器不会将元素视为 CDATA 支持scriptstyle也不理解 CSS 和脚本注释,但会理解 HTML 注释。因此,他们将注释掉这两个元素中的所有 CSS 和脚本。首先应用第一行 HTML 注释 ( <!--/*-->),然后<![CDATA[/*>块被读取,这对他们来说成为一个空的未知元素并被忽略。后面的 HTML 注释隐藏了从那里到块末尾的所有 CSS 和脚本。final<!]]>对他们来说是另一个被忽略的空元素。对于 XHTML,这些解析器不会将这些元素内的内容作为 CDATA 读取,而是理解 HTML 注释。因此,他们删除了第一个评论块。<![CDATA[接下来为它们启动 CDATA 块,将标签内的所有样式和脚本包裹起来,直到]]>被读取。CDATA 块中的所有内容都被解释为 HTML5 解析器现在所做的 - 作为普通的 CSS 和脚本 - 到 XHTML 解析器,而不是像以前那样作为 HTML 标记。所有 CSS 和脚本注释也适用。因为 XHTML 知道 CSS 和脚本,所以它现在仍然可以正确解析它们。XML 解析器使用这些规则与 XHTML 一样工作,除了不知道 CDATA 块中的 CSS 和脚本注释之外,它们只是将所有内容解释为元素中的纯字符文本。

于 2021-02-28T02:11:29.637 回答
5

也许见:http ://wiki.whatwg.org/wiki/HTML_vs._XHTML

<![CDATA[...]]> 是一个虚假的评论。

在 HTML 中,<script>已经受到保护——这就是为什么有时必须将其写为a = "<" + "/script>",以避免混淆浏览器。请注意,该代码在 HTML 中的 CDATA之外有效。

于 2010-07-21T18:47:01.313 回答