【问题标题】:How to maintain state of the DOM manipulated by jQuery/javasscript when reRendering richfaces/jsf components?重新渲染richfaces/jsf组件时如何维护jQuery/javasscript操作的DOM状态?
【发布时间】:2012-02-13 21:22:59
【问题描述】:

在我的jsf 应用程序中渲染我的一些组件时遇到了问题。 问题是当我在页面上使用jQuery 时,例如隐藏按钮。当页面重新呈现时,按钮返回到应该隐藏的原始形式。

有没有人有这方面的专业知识可以帮助我找到合适的解决方案,或者这里有一些我盲目误解的原则或技术?

谢谢。 :)

【问题讨论】:

    标签: jquery jsf-2 richfaces


    【解决方案1】:

    问题是当我在页面上使用 jQuery 时,例如隐藏按钮。当页面重新呈现时,按钮返回到应该隐藏的原始形式。

    不要使用 jQuery 来操作 DOM,而是使用 JSF Ajax 来操作 DOM。

    例如

    <h:form>
        <h:selectBooleanCheckbox value="#{bean.checked}">
            <f:ajax render="buttons" />
        </h:selectBooleanCheckbox>
    
        <h:panelGroup id="buttons">
            <h:commandButton value="Submit" rendered="#{bean.checked}" />
        </h:panelGroup>
    </h:form>
    

    另见:

    【讨论】:

    • 感谢大师的回答,非常有帮助。:)
    【解决方案2】:

    我们在 IceFaces 1.8.2 中遇到了同样的问题。问题是服务器端应用程序不知道客户端对 DOM 的更改。我们通过将标记类应用于我们想用 jQuery 操作的元素来为我们解决了这个问题。我们使用 DOM-Updates 的通用客户端回调(IceFaces 1.8.x 下的onAsynchronousReceive)重新应用我们的脚本。

    不幸的是,不是 RichFaces 特定的:

    <h:outputText value="my text" styleClass="doSomethingWithThisAfterDOMUpdate" />
    

    在你的页面标记中的某个地方(我们使用绑定到 j 而不是 $ 的 jQuery):

    <script type="text/javascript">
    
        // do somehting the first time
        j(".doSomethingWithThisAfterDOMUpdate").css('display', 'none'); 
    
        Ice.onAsynchronousReceive("document:body", function() {
    
            // do it again after each asynchronous receive
            j(".doSomethingWithThisAfterDOMUpdate").css('display', 'none');
        });
    </script>
    

    但是:小心地将侦听器应用于回调中的元素。如果元素没有被替换,您将第二次、第三次、第四次分配相同的侦听器...

    在 JSF2 下,AJAX 成为规范的一部分。你可以看看客户端方法addOnEvent,它可能是 Ice.onAsynchronousReceive 的通用计数器部分。

    然而,并非所有组件框架似乎都使用规范的客户端实现来执行其 DOM 更新(即 PrimeFaces)。

    但我想原理变得清晰了。您需要在 DOM 元素被替换后重新运行脚本 :)

    【讨论】:

    • 由于我只能评论我自己的答案:BalusC 是对的,如果有 JSF 方法可以做到,你应该使用它。例如,几乎每个组件都有一个渲染标志,因此使用 jQuery 来显示和隐藏内容并没有多大意义。也许我应该选择一个不同的例子。然而,在某些情况下,当组件不能提供您需要的所有功能时,它会超出隐藏和显示内容的范围。然后你就有机会在 DOM 中修复一些东西,比如如果自定义组件本身没有呈现一个元素,则为元素添加一个标题属性......
    • 谢谢先生,这很有帮助..:)
    猜你喜欢
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 2023-04-09
    • 2013-05-07
    • 2019-11-09
    • 2011-02-06
    • 2018-06-05
    相关资源
    最近更新 更多