【发布时间】:2011-10-28 20:46:51
【问题描述】:
CDATA 在 JavaScript 标记和 HTML 中的用途是什么?
<script type="text/javascript">
// <![CDATA[
// ]]>
</script>
【问题讨论】:
标签: javascript html xhtml cdata
CDATA 在 JavaScript 标记和 HTML 中的用途是什么?
<script type="text/javascript">
// <![CDATA[
// ]]>
</script>
【问题讨论】:
标签: javascript html xhtml cdata
XML 文档中的所有文本都将被解析器解析。
但是解析器会忽略 CDATA 部分中的文本。
CDATA -(未解析的)字符数据
术语 CDATA 用于表示不应由 XML 解析器解析的文本数据。
像“
"
"&" 将产生错误,因为解析器将其解释为字符实体的开始。
有些文本,比如 JavaScript 代码,包含很多“
解析器会忽略 CDATA 部分中的所有内容。
CDATA 部分以“
<![CDATA[”开头并以“]]>”结尾
在程序输出中使用 CDATA
如果 Web 浏览器将文档呈现为 HTML,则 XHTML 文档中的 CDATA 部分可能会被不同地解析,因为 HTML 解析器不识别 CDATA 开始和结束标记,也不识别 HTML 实体引用,例如
&lt;在<script>标签内。如果用于显示来自不受信任来源的数据,这可能会导致 Web 浏览器出现渲染问题,并且可能导致跨站点脚本漏洞,因为这两种解析器在 CDATA 部分的结束位置上存在分歧。
另外,请参阅Wikipedia entry on CDATA。
【讨论】:
CDATA 在 HTML 中完全没有意义。
CDATA 是一个 XML 结构,它设置标记的内容,通常是 #PCDATA - 已解析的字符数据,改为 #CDATA,即未解析的字符数据。它仅在 XHTML 中相关且有效。
在script标签中使用,避免解析<和&。在 HTML 中,这不是必需的,因为在 HTML 中,script 已经是#CDATA。
【讨论】:
CDATA最好的解释。
来自http://en.wikipedia.org/wiki/CDATA:
因为能够使用小于号 (
<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
【讨论】:
< 和& 并放在其他标签中?支持旧文件怎么样?浏览器会突然放弃对 CDATA 的支持吗?所以我们不能处理其他人创建的我们无法控制的文档?或者只是求助于手动字符串摆弄?
一种编写 HTML 和 XHTML 通用子集的方法
希望更大的便携性。
在 HTML 中,<script> 是一种魔法,它会在</script> 出现之前转义所有内容。
所以你可以写:
<script>x = '<br/>';
和<br/> 不会被视为标签。
这就是为什么这样的字符串:
x = '</scripts>'
必须像这样转义:
x = '</scri' + 'pts>'
见:Why split the <script> tag when writing it with document.write()?
但是 XML(因此 XHTML,它是 XML 的“子集”unlike HTML)没有这种魔力:<br/> 将被视为标签。
<![CDATA[ 是 XHTML 的表达方式:
在下一个
]]>之前不要解析任何标签,将其视为字符串
添加// 是为了使 CDATA 在 HTML 中也能正常工作。
在 HTML 中,<![CDATA[ 并不神奇,所以它可以由 JavaScript 运行。所以//用来注释掉。
XHTML 也可以看到//,但会将其视为空注释行,这不是问题:
//
也就是说:
<!DOCTYPE html> 和<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> 识别文档是HTML 还是XHTML
script 语法来协调文档类型但这违反了互联网的黄金法则:
不要相信第三方,否则你的产品会坏掉
【讨论】:
CDATA 是文档字符集中的字符序列,可能包括字符实体。用户代理应该如下解释属性值: 用字符替换字符实体,
忽略换行,
将每个回车符或制表符替换为一个空格。
【讨论】: