是CDATA标签脚本标记,如果是当过必要吗?
换句话说,这是何时何地:
<script type="text/javascript">
//<![CDATA[
...code...
//]]>
</script>
比这个更可取:
<script type="text/javascript">
...code...
</script>
是CDATA标签脚本标记,如果是当过必要吗?
换句话说,这是何时何地:
<script type="text/javascript">
//<![CDATA[
...code...
//]]>
</script>
比这个更可取:
<script type="text/javascript">
...code...
</script>
如果您需要将文档解析为 XML(例如,当 XHTML 页面被解释为 XML 时)并且您希望能够编写文字i<10
anda && b
而不是i<10
anda && b
,则需要 CDATA 部分,因为 XHTML 会将 JavaScript 代码解析为已解析的字符数据与默认情况下的字符数据相反。对于存储在外部源文件中的脚本,这不是问题,但对于 XHTML 中的任何内联 JavaScript,您可能希望使用 CDATA 部分。
请注意,许多 XHTML 页面从未打算被解析为 XML,在这种情况下,这不会成为问题。
有关该主题的好文章,请参阅https://web.archive.org/web/20140304083226/http://javascript.about.com/library/blxhtml.htm
当浏览器将标记视为 XML 时:
<script>
<![CDATA[
...code...
]]>
</script>
当浏览器将标记视为 HTML 时:
<script>
...code...
</script>
当浏览器将标记视为 HTML 并且您希望 XHTML 1.0 标记(例如)进行验证时。
<script>
//<![CDATA[
...code...
//]]>
</script>
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 中,适用不同的规则。请注意,(非 IE)浏览器仅在 XHMTL 文档使用 XML 内容类型提供时才使用 XML 解析器。
对于 XML 解析器,script
标签并不比任何其他标签好。特别是,脚本节点可能包含非文本子节点,由“ <
”触发;并且“ &
”符号表示字符实体。
所以,在XHTML,这是不是可能:
<script>
if (a<b && c<d) {
alert('Hooray');
}
</script>
要解决此问题,您可以将整个脚本包装在一个CDATA
部分中。这告诉解析器:“在本节中,不要将“ <
”和“ &
”视为控制字符。” 为了防止 JavaScript 引擎解释 " <![CDATA[
" 和 " ]]>
" 标记,您可以将它们包装在注释中。
如果您的脚本不包含任何“ <
”或“ &
”,则CDATA
无论如何您都不需要节。
基本上它是允许编写一个既是 XHTML 又是 HTML 的文档。问题是在 XHTML 中,XML 解析器会解释脚本标签中的 &、<、> 字符并导致 XML 解析错误。因此,您可以使用实体编写 JavaScript,例如:
if (a > 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,因此不应以这种方式解析。