javascript - 我应该使用 "]]>"还是 "//]]>"将 CDATA 部分关闭到 xHTML 中

标签 javascript html css xhtml cdata

我想在不转义特殊字符的情况下将脚本或 CSS 内联到 XHTML。

我可以使用 CDATA 标记部分来做到这一点。

根据 http://www.w3.org/TR/xhtml1/#h-4.8 CDATA 部分可以定义为:

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

然后,根据http://www.w3schools.com/TAGS/tag_script.asp ,CDATA 可能如下所示:

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

哪种关闭 CDATA 部分的方法更好? ]]>//]]> ?

最佳答案

According to www.w3.org/TR/xhtml1/#h-4.8 the CDATA section can be defined as: [no //]

是的。在 XHTML 中,它们可以。正确的 XHTML,由 XML 解析器读取,就像您提供 application/xhtml+xml 时一样到非 IE 的网络浏览器。

但您可能实际上是 text/html ,这意味着您的浏览器不是该部分中提到的“XML 处理器”。这是一个遗留的 HTML4 解析器,所以你必须遵守 appendix C guidelines并避免在 HTML4 中不起作用的任何 XML 特性。

特别是字符串 <![CDATA[]]><script><style> block 对于 HTML4 解析器并不特殊,因为在 HTML4 中,这两个元素是标记不适用的“CDATA 元素”(除了用于结束元素本身的 </ ETAGO 序列)。因此 HTML4 解析器会将这些字符串直接发送到 CSS 或 JavaScript 引擎。

因为 <![CDATA[不是有效的 JS,你会得到一个 JavaScript 语法错误。 (这里的其他答案是错误的:不仅是非常旧的浏览器,而且所有 HTML4 浏览器都会为脚本中未注释的 CDATA 部分提供错误。)

您使用 ///*注释标记以隐藏 JavaScript 或 CSS 引擎的内容。所以:

<script type="text/javascript">//<![CDATA[
    alert('a&b');
//]]></script>

(注意前导 // ;这在 W3Schools 示例代码中被省略,并使该示例代码根本无法工作。失败。不要相信 W3Schools:它们与 W3C 无关,它们的 Material 通常是垃圾。)

这被 HTML 解析器读取为:

  • 打开标签 script建立 CDATA 内容直到下一个 ETAGO
  • 文本 //<![CDATA[\n alert('a&b');\n//]]>
  • ETAGO 和关闭标签 script
  • -> 发送到 JavaScript 引擎的结果内容://<![CDATA[\nalert('a&b');\n//]]>

但是通过 XML 解析器:

  • 打开标签 script (没有特殊的解析含义)
  • 正文内容//
  • 打开 CDATA 部分建立 CDATA 内容直到下一个 ]]>顺序
  • 文本 \n alert('a&b');\n//
  • 关闭 CDATA 部分
  • 关闭标记 script
  • -> 发送到 JavaScript 引擎的结果内容://\nalert('a&b');\n//

虽然解析过程完全不同,但 JS 引擎在每种情况下都以相同的有效代码结束,这要归功于 //唯一的区别在于评论。

请注意,这与老派的情况截然不同:

<script type="text/javascript"><!--
    alert('a&b');
//--></script>

这是为了隐藏脚本/样式内容,这样它就不会在不理解的浏览器中写入页面 <script><style>标签。这不会产生 JavaScript/CSS 错误,因为黑客将其置于不同的层次:这是 CSS 和 JavaScript 语言的语法特征自身 <!--被定义为什么都不做,允许这个 hack 工作。

那些浏览器是古老的历史;你今天绝对不应该使用这种技术。尤其是在 XHTML 中,因为 XML 解析器会相信您的话,将整个脚本 block 转换为 XML 注释而不是可执行代码。

I want to inline Scripts or CSSs into xHTML without escaping special characters.

避免这样做,你会更快乐。

真的需要<吗?和 & <style> 中的字符?不,几乎从来没有。你真的需要它们吗 <script> ?好吧......有时候,是的,在那种情况下,评论的 CDATA 部分是可以接受的。

但老实说,XHT​​ML 兼容性准则 C.4 适用于 HTML4 和 XHTML1:任何重要的东西都应该是外部脚本,这样您就不必担心这些。

关于javascript - 我应该使用 "]]>"还是 "//]]>"将 CDATA 部分关闭到 xHTML 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2375217/

相关文章:

javascript - 使用 Javascript 中的 regex 或 indexOf 更改字符串中的特定字符(转义字符)

html - 在 scss 中带有正常文本的倾斜 div

javascript - 如何获取内部 JSON 的名称

javascript - 如何根据 URL 条件滚动到 anchor ?

javascript - 如何根据文本变量选择 MultipleChoice 选项

javascript - 带 Owl Carousel 的 slider

html - 要创建什么基本的.htaccess错误页面?

jQuery Accordion 未显示

javascript - HTML 5 Canvas 元素无法在 .setInterval 方法中正确设置动画

css - 响应重叠问题