什么是HTML中的CDATA?

191

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

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

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

141

一个XML文档中的所有文本都将被解析器解析。

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

CDATA - (未解析)字符数据

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

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

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

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

一些文本,比如JavaScript代码,包含很多“<”或“&”字符。为避免错误,脚本代码可以定义为CDATA。

CData部分内的所有内容都将被解析器忽略。

CData部分以“<![CDATA[”开头,以“]]>”结束。

程序输出中使用CDATA

XHTML文档中的CDATA部分可能会被Web浏览器以不同的方式解析,如果它们将文档呈现为HTML,则HTML解析器不会识别CDATA的起始和结束标记,也不会识别在< script>标记内的HTML实体引用,这可能会导致Web浏览器中的渲染问题,并且如果用于显示来自不受信任来源的数据,则可能导致跨站点脚本攻击,因为两种解析器将无法达成关于CDATA部分结束位置的共识。

SGML简要教程

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


7
我认为我有一个更好的问题。总体来说,使用CDATA标记有哪些好处? - ajameswolf
@ajameswolf 你可以查看这个链接 https://dev59.com/1XVD5IYBdhLWcg3wKYP- - Anant

100

CDATA在HTML中没有任何意义。

CDATA是一个XML结构,它将标签的内容(通常为#PCDATA - 解析字符数据)设置为#CDATA,即非解析字符数据。它仅在XHTML中相关和有效。

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


13
人们为什么在JavaScript标签内使用它?它有什么意义和作用,谢谢。 - SexyMF
1
@SexyMF 可能是因为这些人打的是XHTML文档而不是SGML/HTML,或者他们想帮助不太符合标准的浏览器正确加载他们的页面。 - Armen Michaeli
1
尽管已经有将近6年的历史,但这仍然是我见过的最好的CDATA解释。 - freginold
它在HTML中确实有意义,这取决于你是否遇到了这个问题。 - YogaPanda

20

2
我对正在发生的事情感到困惑。1)字符数据仍然存在于DOM4中吗?https://www.w3.org/TR/dom/#interface-characterdata 2)但是CDATASection将被删除?https://www.w3.org/TR/dom/#dom-core,那么替代方案是什么?强制编码或所有`<&`都放置在其他标记中?旧文档如何支持?浏览器会突然放弃CDATA支持吗?因此,我们无法处理由其他人创建的文档,我们无法控制吗?还是只能手动操作字符串? - user2895783
1
只需转义特殊字符。 - Daniel De León
1
创建XML时,我知道只需转义字符即可。 但是,我的问题是如何处理CDATA部分(例如,来自我们无法控制且可能更新其格式缓慢的源),在浏览器从DOM中删除CDATASection后怎么办?他们什么时候会删除?FF 49仍然在DOM中显示CDATASection。在它被淘汰并从浏览器中删除之后的过渡期间,我不清楚如何处理这种情况。只会被视为文本节点吗?错误(错误标记)?只是试图避免手动查找文本中的标记以提取其中的数据的丑陋。 - user2895783
4
CDATA本身并没有被弃用。XHTML是基于XML的,因此必须支持CDATA。(在HTML中,CDATA标记没有意义;它将只被解析为一个虚假注释。)被弃用的是CDATASection接口;如果页面被解析为XHTML,它的内容将出现在DOM中作为普通文本节点。 - Mike Rosoft
具有讽刺意味的是,Mozilla的链接不再提到它已被弃用,并显示所有当前浏览器都支持它。 - CTS_AE
显示剩余2条评论

19

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

在Web页面脚本中使用小于号(<)和&符号(&)很有用,以及较少的情况下样式,为了避免记住对它们进行转义,通常在XHTML文档的行内代码和元素文本周围使用CDATA标记。但是为了使文档也能被HTML解析器解析(因为它们不会识别CDATA标记),所以CDATA标记通常被注释掉,如下面这个JavaScript示例:

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

当我开始学习JavaScript的时候,我经常看到这种情况,真的让我回想起了过去。 - Lazerbeak12345

12

一种编写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还是XHTML,包括<!DOCTYPE html><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  • 符合规范的网站可以依赖符合规范的浏览器,并使用单个有效的script语法来协调文档类型

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

不要相信第三方,否则您的产品将会崩溃


在HTML中,<script>是魔法,可以转义一切,直到</script>出现。实际上,根据规范,它应该一直转义,直到出现"</script(\w)+"。 - Matěj Štágl

6

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

  • 使用字符替换字符实体,

  • 忽略换行符,

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


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