HTML 中的 CDATA 是什么?

IT技术 javascript html xhtml cdata
2021-02-04 08:42:13

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

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

// ]]>
</script> 
6个回答

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

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

CDATA -(未解析的)字符数据

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

像“<”和“&”这样的字符在 XML 元素中是非法的。

"<" 会产生一个错误,因为解析器将它解释为一个新元素的开始。

"&" 会产生错误,因为解析器将它解释为字符实体的开始。

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

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

一个CDATA部件开始用“ <![CDATA[”,并结束与“ ]]>

在程序输出中使用 CDATA

如果 Web 浏览器将文档呈现为 HTML,则 XHTML 文档中的 CDATA 部分可能会被 Web 浏览器以不同方式解析,因为 HTML 解析器不识别 CDATA 开始和结束标记,也不识别 HTML 实体引用,例如标签&lt;<script>如果用于显示来自不受信任来源的数据,这可能会导致 Web 浏览器中的呈现问题,并可能导致跨站点脚本漏洞,因为这两种解析器将在 CDATA 部分结束的位置上存在分歧。

一个简短的 SGML 教程

另外,请参阅CDATA 上维基百科条目

@ajameswolf 您可以查看此stackoverflow.com/questions/66837/...
2021-04-06 08:42:13
我想我有一个更好的问题。概括地说,使用 CDATA 标签有什么好处?
2021-04-12 08:42:13

CDATA 在 HTML 中根本没有任何意义。

CDATA是一个 XML 构造,它设置通常是 #PCDATA - 解析的字符数据的标签内容,取而代之的是 #CDATA,即未解析的字符数据。它仅在 XHTML 中相关且有效。

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

那么,人们是否在 Javascript 标签中使用它?它在哪里有任何意义,是为了什么,谢谢
2021-03-18 08:42:13
@SexyMF 可能是因为这些人键入 XHTML 文档而不是 SGML/HTML,和/或他们希望帮助不太符合标准的浏览器无论如何正确加载他们的页面。
2021-03-31 08:42:13
它在 HTML 中确实有意义,取决于您是否遇到问题
2021-04-07 08:42:13
尽管它已经快 6 岁了,但这仍然是CDATA我见过的最好的解释
2021-04-11 08:42:13

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

由于能够在网页脚本中使用小于号 (<) 和与号 (&) 以及在较小程度上使用样式很有用,而不必记住对它们进行转义,因此通常在周围使用 CDATA 标记XHTML 文档中内联和元素的文本。但是为了使文档也可以被 HTML 解析器解析,它不识别 CDATA 标记,CDATA 标记通常被注释掉,如下面的 JavaScript 示例所示:

<script type="text/javascript">
//<![CDATA[
document.write("<");
//]]>
</script>
伙计……当我开始学习 JavaScript 时,我经常看到这个……真的让我回过神来。
2021-03-16 08:42:13

CDATA 已过时

请注意,不应在 HTML 中使用 CDATA 部分;它们只适用于 XML。

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

https://developer.mozilla.org/en-US/docs/Web/API/CDATASection#Specifications

MDN 截图

只是转义特殊字符。
2021-03-13 08:42:13
我理解,对于 XML 的创建,只需转义字符即可。但是,我关心的是如何在浏览器从 DOM 中删除 CDATASection 之后处理 CDATA 部分(例如,来自我们无法控制的提要并且更新其格式可能很慢)?他们什么时候会掉?FF 49 仍在向我展示 DOM 中的 CDATASection。我不清楚在这种情况下如何在它被淘汰并从浏览器中删除后的过渡时间内处理。只会被视为文本节点吗?错误(坏标签)?只是试图避免在文本中手动查找标记以提取内部数据的丑陋。
2021-03-19 08:42:13
CDATA 本身并没有被弃用。XHTML 基于 XML,因此它必须支持 CDATA。(在 HTML 中,CDATA 标记没有意义;它只会被解析为虚假注释。)不推荐使用的是 CDATASection 接口;如果一个页面被解析为 XHTML,它的内容将作为一个普通的文本节点出现在 DOM 中。
2021-03-28 08:42:13
我对正在发生的变化感到困惑。1) DOM4 中还存在字符数据吗? w3.org/TR/dom/#interface-characterdata 2) 然而 CDATASection 正在被删除? w3.org/TR/dom/#dom-core 有 什么替代方案?强制编码还是全部<&并放置在其他标签中?如何支持旧文件?浏览器会突然放​​弃 CDATA 支持吗?所以我们不能处理其他人创建的我们无法控制的文档?或者只是求助于手动拨弦?
2021-04-04 08:42:13
抱歉,XHTML 已经过时了!但是如果你想要一个 HTML/XML,你可以使用 XHTML5。仅供参考:en.wikipedia.org/wiki/HTML5#XHTML5_(XML-serialized_HTML5)
2021-04-06 08:42:13

一种编写 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 运行。So//用于注释掉它。

XHTML 也会看到//, 但会将其视为一个空注释行,这不是问题:

//

那说:

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

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

不要相信第三方,否则您的产品会损坏