【问题标题】:Javascript and `<>...</>` tagsJavascript 和 `<>...</>` 标签
【发布时间】:2026-01-03 11:35:01
【问题描述】:

所以我最近发现我可以在 Firefox 的 javascript 中使用 &lt;&gt;...&lt;/&gt; 标签,这在定义 HTML 或 CSS 块时很方便。

GM_addStyle(<><![CDATA[
  .page { display: block }
  /* ... */
  td { vertical-align: top }
]]></>);
//...
div.innerHTML = <><![CDATA[
  <table class="section">
    <!-- ... -->
  </table>
]]></>;

但我不确定发生了什么,我喜欢理解我正在使用的语法。 &lt;&gt;...&lt;/&gt; 究竟返回了什么?我注意到当我将内容包含在&lt;![CDATA[...]]&gt; 中时,转义效果更好,那么那里发生了什么?这是仅 Firefox,还是跨浏览器?

我尝试在网上查找此内容,但遇到了正常的 google/symbol 问题。另外,google CDATA javascript 的大部分结果似乎并不相关。

【问题讨论】:

  • +1,好问题。不要幻想在这里获得跨浏览器兼容性的机会 :-) 不过对于 Firefox 扩展来说很好。
  • @Andy E - 它看起来像是在 javascript 1.6 标准中,所以它应该适用于任何支持它的东西。
  • 它叫做,ECMAScript for XML。看到这个我也很惊讶,尽管我已经读过很多遍了。这是关于此的*信息 (en.wikipedia.org/wiki/ECMAScript_for_XML)
  • it (ECMAScript for XML) 是 JavaScript 的扩展。 Gecko 在它自己的 JavaScript 1.6 引擎中实现了这一点,但这并不一定意味着其他人已经 - 或者永远会。

标签: javascript cdata


【解决方案1】:

我相信空标签只是编写根元素的一种方式,以便您可以在其中包装 XML 块。它是说“将此根元素的子元素解释为 XML”,而您的情况下的单个子元素是说“将此子元素解释为 CDATA 块。”

【讨论】:

【解决方案2】:

没有理由使用只有一个孩子的 XMLList 文字 (&lt;&gt;...&lt;/&gt;),因为无论如何它都是作为单个 XML 项处理的。为什么不只使用&lt;![CDATA[...]]&gt;?此外,&lt;![CDATA[...]]&gt; 只返回一个 XML 文本节点 (&lt;![CDATA[]]&gt;.nodeKind() === "text")。

这都是 E4X 的一部分,它由 ActionScript 3 和两个 JavaScript 引擎实现。

【讨论】:

  • 嗯...只是 &lt;![CDATA[]]&gt; 是 FF3.6 中的语法错误(只需将其插入错误控制台)。我不确定它会如何在 Greasemonkey 脚本中进行评估,但 mozilla 文档 (developer.mozilla.org/En/E4X/Processing_XML_with_E4X) 说您需要设置一个特殊属性以防止 在普通 标签。
  • 这是因为您在错误控制台中评估 JavaScript 1.5,而不是 1.6。 CDATA 问题不会出现在greasemonkey 脚本中,因为它不是内联HTML 脚本。将;e4x=1 添加到脚本type 的末尾。或者更好的是,使用这个可以让你使用 E4X 的 shell:code.eligrey.com/shell/shell.html
【解决方案3】:

正如以利亚所说,E4X 语法在 Mozilla 以外的任何地方都无法使用。您似乎没有将它用于与 XML 相关的任何事情,只是依赖于 XML 对象的隐式 toString 方法与原始标记相同。 ECMA-357(E4X 规范)没有为 XML 指定确切的解析和序列化规则,因此它不能保证例如。为您删除 &lt;![CDATA[ 标记。 IMO 甚至仅在 Firefox 上依赖这一点都是值得怀疑的。

无论如何,它并不能真正解决转义内容以供在script 块内使用的问题...特别是,&lt;/ 序列在 HTML4 中仍然无效,在 XHTML 中全部无效,而且您仍然需要担心内容中的序列&lt;/script]]&gt;。因此,您并没有真正获得很多……充其量,您在外部脚本中获得了一个多行字符串,但代价是对所有其他浏览器的支持。我觉得不值得。

【讨论】: