脚本标记中何时需要 CDATA 部分?

IT技术 javascript html xhtml cdata
2021-02-08 07:20:38

CDATA标签脚本标记,如果是当过必要吗?

换句话说,这是何时何地:

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

比这个更可取:

<script type="text/javascript">
...code...
</script>
6个回答

如果您需要将文档解析为 XML(例如,当 XHTML 页面被解释为 XML 时)并且您希望能够编写文字i<10anda && b而不是i&lt;10anda &amp;&amp; b则需要 CDATA 部分,因为 XHTML 会将 JavaScript 代码解析为已解析的字符数据与默认情况下的字符数据相反。对于存储在外部源文件中的脚本,这不是问题,但对于 XHTML 中的任何内联 JavaScript,您可能希望使用 CDATA 部分。

请注意,许多 XHTML 页面从未打算被解析为 XML,在这种情况下,这不会成为问题。

有关该主题的好文章,请参阅https://web.archive.org/web/20140304083226/http://javascript.about.com/library/blxhtml.htm

如果避免&<字符,则不需要 CDATA 部分;它在 HTML 和 XHTML 中都能正常工作。您可以通过将所有重要代码放在外部脚本中并仅使用内联脚本来轻松实现这一点。INITIALISE变量(逃逸&/<\x26/\x3C在字符串中如果需要)。
2021-03-13 07:20:38
@Loren:那么它仍然完全是关于验证的。用户代理拒绝无效 XML 的程度是正交的。
2021-03-15 07:20:38
它不仅仅是“验证”。如果遇到非法字符,大多数严格的 XML 解析器将不会通过页面。这不仅仅是为了让 W3C 开心,让绿色而不是红色。
2021-03-21 07:20:38
@Mathew Attle - 这是一个很好的问题。在一个单独的线程上提出一个很好的问题,以确保它得到它需要的关注。
2021-03-22 07:20:38
在 HTML5 的情况下呢?
2021-04-04 07:20:38

当浏览器将标记视为 XML 时:

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

当浏览器将标记视为 HTML 时:

<script>
    ...code...
</script>

当浏览器将标记视为 HTML 并且您希望 XHTML 1.0 标记(例如)进行验证时。

<script>
//<![CDATA[
    ...code...
//]]>
</script>
第一部分中的“...as XML”不应该是“...as non-interpreted text”吗?stackoverflow.com/questions/2784183/what-does-cdata-in-xml-mean我们看到了“......这些字符串包含的数据可能被解释为XML标记,但不应该是。”
2021-03-14 07:20:38
@mattwilkie,我对“as XML”的意思是“当浏览器使用他们的 XML 解析器(而不是 HTML 解析器)来解析标记时,因为文档是使用基于 XML 的 MIME 类型发送的,或者包含标记的文件具有基于 XML 的文件扩展名”。
2021-03-21 07:20:38
出于代码安全的考虑,最好用块注释包围 CDATA,/* ... */否则如果删除换行符,代码将中断
2021-03-28 07:20:38

HTML

HTML解析器将把之间的一切<script>,并</script>作为脚本的一部分。有些实现甚至不需要正确的结束标记;他们在“ </处停止脚本解释,根据规范,这是正确的

更新在 HTML5 和当前的浏览器中,情况不再如此。

因此,在HTML中,这是不是可能:

<script>
var x = '</script>';
alert(x)
</script>

一个CDATA部分根本没有影响这就是为什么你需要写

var x = '<' + '/script>'; // or
var x = '<\/script>';

或类似。

这也适用于作为text/html. (由于 IE 不支持 XML 内容类型,所以这基本上是正确的。)

XML

在 XML 中,适用不同的规则。请注意,(非 IE)浏览器仅在 XHMTL 文档使用 XML 内容类型提供时才使用 XML 解析器。

对于 XML 解析器,script标签并不比任何其他标签好。特别是,脚本节点可能包含非文本子节点,由“ <触发并且“ &”符号表示字符实体。

所以,在XHTML,这是不是可能:

<script>
if (a<b && c<d) {
    alert('Hooray');
}
</script>

要解决此问题,您可以将整个脚本包装在一个CDATA部分中。这告诉解析器:“在本节中,不要将“ <”和“ &”视为控制字符。” 为了防止 JavaScript 引擎解释 " <![CDATA[" 和 " ]]>" 标记,您可以将它们包装在注释中。

如果您的脚本不包含任何“ <”或“ &”,则CDATA无论如何您都不需要节。

实际上,我遇到了验证问题 -<script>var b = "<b>bold</b>";</script>无法验证,但在阅读您的答案并更改以<script>var b = "<b>bold<\/b>";</script>修复它之后。
2021-03-12 07:20:38
@SalmanA 这是 HTML 的奇怪之处之一,正式称为ETAGO了解更多信息:mathiasbynens.be/notes/etago(虽然文章指出没有浏览器实现过该功能,但我很确定它给我带来了一些麻烦。也许在其他工具中)
2021-03-18 07:20:38
声明“A CDATA 部分根本没有效果”对于(提议的)HTML5 来说是不正确的,它识别结构。w3.org/TR/html5/syntax.html#cdata-sections
2021-03-30 07:20:38
不知道任何 </内部脚本标签都是坏的。
2021-04-04 07:20:38
@danorton 有趣。我认为这是一个非常丑陋的组合。尽管如此,仍然对脚本内容没有影响。
2021-04-08 07:20:38

基本上它是允许编写一个既是 XHTML 又是 HTML 的文档。问题是在 XHTML 中,XML 解析器会解释脚本标签中的 &、<、> 字符并导致 XML 解析错误。因此,您可以使用实体编写 JavaScript,例如:

if (a &gt; b) alert('hello world');

但这是不切实际的。更大的问题是,如果您以 HTML 格式阅读页面,则标记脚本“默认”被视为 CDATA,并且此类 JavaScript 将不会运行。因此,如果您希望在使用 XHTML 和 HTML 解析器时都可以使用相同的页面,则需要将脚本标记包含在 XHTML 中的 CDATA 元素中,但不要将其包含在 HTML 中。

这个技巧将 CDATA 元素的开始标记为 JavaScript 注释;在 HTML 中,JavaScript 解析器会忽略 CDATA 标记(这是一个注释)。在 XHTML 中,XML 解析器(在 JavaScript 之前运行)检测到它,并将 CDATA 结束之前的其余部分视为 CDATA。

这是一个 X(HT)ML 的东西。当您在 JavaScript 中使用类似<和 的符号时>,例如比较两个整数,这必须像 XML 一样解析,因此它们会标记为标签的开头或结尾。

CDATA 意味着以下几行(直到 的所有]]>内容都不是 XML,因此不应以这种方式解析。