我想在不转义特殊字符的情况下将脚本或 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 部分是可以接受的。
但老实说,XHTML 兼容性准则 C.4 适用于 HTML4 和 XHTML1:任何重要的东西都应该是外部脚本,这样您就不必担心这些。
关于javascript - 我应该使用 "]]>"还是 "//]]>"将 CDATA 部分关闭到 xHTML 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2375217/