【问题标题】:JSF components not parsed inside a <script> block未在 <script> 块内解析的 JSF 组件
【发布时间】:2015-10-17 15:59:34
【问题描述】:

我不得不在 JSF 页面中更改 &lt;script&gt; ... &lt;/script&gt; 并尝试评估脚本内的 JSF 组件。对 EL 进行了评估,但标签本身没有受到影响。

这种行为的原因是什么?

例子:

<script type="text/javascript">
    //<![CDATA[
        function doSomething() {
            $('.userNode').droppable({
                activeClass : 'ui-state-active',
                hoverClass : 'ui-state-highlight',
                tolerance : 'intersect',
                drop : function(event, ui) {
                   <h:panelGroup rendered="#{myBean.useThis}">
                     alert("code A");
                   </h:panelGroup>
                   <h:panelGroup rendered="#{!myBean.useThis}">
                     alert("code B");
                   </h:panelGroup>
        }
            });
        };
    //]]>   </script>

EL #{!myBean.useThis} 被评估为真/假,但 &lt;h:panelGroup&gt; 在呈现结果中。

为什么?

【问题讨论】:

    标签: javascript jsf facelets


    【解决方案1】:

    这是因为您将它放置在 CDATA 块中。 CDATA 块中的任何内容都被视为字符数据,而不是 XML 数据。

    最好不要这样做。这是一个糟糕的做法。将 JS 函数放在它自己的 .js 文件中。仅使用 JSF/EL 准备 JavaScript 变量,然后 JS 函数将请求(作为方法参数)或自行访问(在窗口范围内),而不是填充部分 JS 函数。

    例如

    <h:outputScript>var useThis = #{myBean.useThis};</h:outputScript>
    <h:outputScript name="script.js" />
    
    function doSomething() {
        $('.userNode').droppable({
            activeClass : 'ui-state-active',
            hoverClass : 'ui-state-highlight',
            tolerance : 'intersect',
            drop : function(event, ui) {
               if (useThis) {
                   alert("code A");
               }
               else {
                   alert("code B");
               }
            }
        });
    }
    

    为防止污染全局范围,请考虑创建命名空间。

    <h:outputScript>var my = my||{}; my.useThis = #{myBean.useThis};</h:outputScript>
    
               if (my.useThis) {
                   alert("code A");
               }
               else {
                   alert("code B");
               }
    

    另见:

    【讨论】:

    • 我们完全改变了部分,现在它可以在没有 JS 的情况下工作。您的设计评论是正确的。对我来说,很少有标签没有经过评估,我想知道原因。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-05-14
    • 2019-12-08
    • 2020-02-01
    • 2016-11-05
    • 2018-10-24
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    相关资源
    最近更新 更多