什么是 HTML 中的 CDATA?

在 JavaScript 标记和 HTML 中使用 CDATA 有什么用?

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


// ]]>
</script>
190635 次浏览

CDATA在 HTML 中没有任何意义。

CDATA是一种 XML 构造,它将标记的内容设置为通常为 # PCDATA 解析的字符数据,取而代之的是 # CDATA,即未解析的字符数据。它只在 XHTML 中是相关和有效的。

它在 script标记中使用,以避免解析 <&。在 HTML 中,这是不需要的,因为在 HTML 中,script已经是 # CDATA。

CDATA 是来自文档字符集的字符序列,可能包括字符实体。用户代理应按以下方式解释属性值:

  • 用字符替换字符实体,

  • 忽略线路传输,

  • 将每个回车符或制表符替换为一个空格。

XML 文档中的所有文本都将由解析器进行解析。

但是 CDATA 节中的文本将被解析器忽略。

字符数据

术语 CDATA 用于指 XML 解析器不应解析的文本数据。

在 XML 元素中,“ <”和“ &”等字符是非法的。

“ <”将生成一个错误,因为解析器将其解释为新元素的开始。

“ &”将生成一个错误,因为解析器将其解释为字符实体的开头。

有些文本,比如 JavaScript 代码,包含大量的“ <”或“ &”字符。为了避免错误,脚本代码可以定义为 CDATA。

CDATA 节中的所有内容都被解析器忽略。

CDATA 部分以“ <![CDATA[”开始,以“ ]]>”结束

在程序输出中使用 CDATA

如果网络浏览器将 XHTML 文档呈现为 HTML 格式,那么 XHTML 文档中的 CDATA 部分很可能被不同的浏览器解析,因为 HTML 解析器不识别 CDATA 起始和结束标记,也不识别 <script>标记中的 HTML 实体引用,例如 &lt;。这可能会导致网页浏览器的渲染问题,并且如果用于显示来自不可信来源的数据,可能会导致跨网站脚本漏洞,因为这两种解析器在 CDATA 部分的结束位置上存在分歧。

简短的 SGML 教程

还有,看看 CDATA 上的 Wikipedia 条目

来自 http://en.wikipedia.org/wiki/CDATA:

因为能够使用小于号(<)和 在网页脚本中的 & 符号,以及在较小程度上的样式, 无需记住转义它们,通常使用 CDATA 中的内联文本和元素周围的标记 但是这样文档也可以被 HTML 解析 不能识别 CDATA 标记(CDATA 标记)的解析器 通常被注释掉,就像这个 JavaScript 示例:

<script type="text/javascript">
//<![CDATA[
document.write("<");
//]]>
</script>

CDATA 是 过时了

请注意,CDATA 节不应该在 HTML 中使用; 它们只能在 XML 中使用。

所以不要在 HTML 5中使用它。

Https://developer.mozilla.org/en-us/docs/web/api/cdatasection#specifications

Screenshot from MDN

一种编写 HTML 和 XHTML 公共子集的方法

希望有更好的可移植性。

在 HTML 中,<script>是在出现 </script>之前的所有转义。

所以你可以写:

<script>x = '<br/>';

<br/>不会被认为是一个标签。

这就是为什么字符串如:

x = '</scripts>'

必须像这样:

x = '</scri' + 'pts>'

见: 在使用 document.write ()编写时,为什么要拆分 < script > 标记?

但是 XML (因此 XHTML 是 XML 的一个“子集”,即 不像 HTML)并没有这种魔力: <br/>将被视为一个标记。

<![CDATA[是 XHTML 的说法:

在下一个 ]]>之前不要解析任何标记,把它看作是一个字符串

添加 //是为了使 CDATA 在 HTML 中也能很好地工作。

在 HTML 中,<![CDATA[并不神奇,因此它将由 JavaScript 运行。所以使用 //对其进行注释。

XHTML 也可以看到 //,但是将它看作一个空的注释行,这不是问题:

//

也就是说:

  • 兼容的浏览器应该能够识别文档是 HTML 还是来自最初的 doctype <!DOCTYPE html><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">的 XHTML
  • 兼容的网站可以依赖兼容的浏览器,并使用单一有效的 script语法协调 doctype

但这违反了互联网的黄金法则:

不要相信第三方,否则你的产品会坏掉