javascript - 未在 <script> block 内解析的 JSF 组件

标签 javascript jsf facelets

我不得不改变一个<script> ... </script>在 JSF 页面中,并尝试评估脚本内部的 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}被评估为真/假,但 <h:panelGroup>是渲染的结果。

为什么?

最佳答案

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

最好不要这样做。这是一种不好的做法。将 JS 函数放在它自己的 .js 文件中。仅使用 JSF/EL 来准备 JS 函数随后将要求(作为方法参数)或自行访问(在窗口范围内)的 JavaScript 变量,而不是填充部分 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");
           }

另见:

关于javascript - 未在 &lt;script&gt; block 内解析的 JSF 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31653562/

相关文章:

javascript - 剑道网格 : how to use a column template so editor always available?

javascript - 如何修复按钮不添加新的 <li>

jsf-2 - :param to composite components

javascript - 在 Vue.JS 中显示 Axios 响应数据

javascript - 我可以获取此代码的演练吗

html - html表格行的行计数器

jsf - 如何有条件地渲染 f :selectItem tag?

jsf - 如何解决 JSF 1.2 中的 ViewExpiredException

java - Facelet dataTable : method not found in backing bean, 尝试将实例发送回 bean

jsf - 在 facelets JSF 2 中输出 map 集合