【问题标题】:JSF 2.2 CDATA is escapedJSF 2.2 CDATA 被转义
【发布时间】:2013-09-17 12:12:05
【问题描述】:

升级到 Mojarra 2.2.3 后,我发现了一些奇怪的行为。以下 Javascript 声明被破坏:

在 .xhtml 文件中:

<script type="text/javascript">
<!-- /* <![CDATA[ */
    $(document).ready(function() {                                                                             
        if ($('#some_identifier').size() > 0) 
        ...
/* ]]> */-->
</script>

这被扭曲成以下废话:

<script type="text/javascript">
<!-- /* &lt;![CDATA[ */
    $(document).ready(function() {
        if ($('#some_identifier').size() &gt; 0)
        ...
/* ]]&gt; */-->
</script>

这会破坏 .xhtml 文件中嵌入的所有 javascript 代码。我验证了我们之前使用的版本(2.0.x)不会发生这种情况,所以我必须假设它与新的 Mojarra 版本有关。有关如何解决或解决此问题的任何想法?

【问题讨论】:

    标签: jsf-2 facelets cdata jsf-2.2


    【解决方案1】:

    此 CDATA 语法完全无效。目前尚不清楚你从哪里得到这个以及为什么你认为它是有效的。也许您将它与 CSS 代码的 CDATA 语法混淆了。无论如何,对于 JS 代码中正确的 CDATA 语法,请仔细阅读这篇 Mozilla 开发者网络文章:Writing JavaScript for XHTML

    有效的(现代)语法是:

    <script type="text/javascript">
      <![CDATA[
        $(document).ready(function() {                                                                             
          if ($('#some_identifier').size() > 0) 
            ...
      ]]>
    </script>
    

    如果你真的,真的需要支持世界上没有人使用的旧浏览器,那么请使用以下语法,它应该适用于那些本身不支持 JavaScript 并因此无法解析 &lt;script&gt; 元素的浏览器(想知道自己,你的 JSF 应用程序,丰富的 JavaScript,还能在那些 web 浏览器上运行吗?为它们转义 JS 真的有用吗?)

    <script type="text/javascript">
      <!--//--><![CDATA[//><!--
        $(document).ready(function() {                                                                             
          if ($('#some_identifier').size() > 0) 
            ...
      //--><!]]>
    </script>
    

    顺便说一句, 更好的办法是将 JS 代码放在它自己的 .js 文件中。

    另见:

    【讨论】:

    • 第一个语法不起作用(在 Ubuntu 上使用 Firefox 和 Google Chrome 进行测试,但都拒绝使用)。第二种变体似乎有效。谢谢,BalusC。
    • 显然您使用错误的内容类型或文档类型提供 HTML 输出,导致这些浏览器混淆。它应该是text/html,您可以通过使用&lt;f:view contentType="text/html"&gt; 包装您的主模板来显式设置它。除此之外,您现在最好使用 HTML5 文档类型&lt;!DOCTYPE html&gt;。重点是,明确告诉浏览器如何解释文档,而不是让它根据错误信息进行猜测。
    • 我认为浏览器与它无关。这里发生的事情是应用程序提供的内容发生了变化。我使用 curl 和 wget 检查了结果,只是查看了应用程序的结果。在上述语法的情况下,两个工具都显示 CDATA 被转义。因此,这不是浏览器解释的问题。不知何故,使用的语法使 JSF 感到困惑。仅在更新到 2.2.3 后才出现的事实进一步加剧了这种怀疑。
    • 我不是在谈论您最初的问题,而是在谈论我的答案中显然对您不起作用的第一个语法。它适用于所有机器和浏览器(也适用于 Mojarra 2.2.3)。它对您不起作用很可能是由于提供了错误的内容或文档类型。这正是我在之前的评论中试图解释的。如果第一种语法对您不起作用,那么您的问题就更大了。
    • 您最初使用的语法完全无效。更多的人犯同样的错误并不能使它成为有效的语法。
    猜你喜欢
    • 2013-09-02
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2014-05-16
    相关资源
    最近更新 更多