【问题标题】:Why is OmniFaces Ajax utility's oncomplete() not working when invoked by preRenderView event?为什么 OmniFaces Ajax 实用程序的 oncomplete() 在 preRenderView 事件调用时不起作用?
【发布时间】:2012-11-29 19:51:15
【问题描述】:

我的 preRenderView 事件调用 OmniFaces Ajax 实用程序的 oncomplete() 方法在客户端上执行 javascript。我刚刚测试了这个,客户端没有执行javascript。

我的 f:event 如下。

<f:metadata>
    <o:enableRestorableView/>
    <f:event type="javax.faces.event.PreRenderViewEvent" listener="#{pageNavigationController.preRenderView()}"/>
</f:metadata>

我的pageNavigationController.preRenderView()在下面,

public void preRenderView() {
    if (initLayoutForPage) {
        // initialize layout for page
        layoutController.initializeForPage(page);
        initLayoutForPage = false;
    }
    if (usersController != null) {
        usersController.preRenderView();
    }
}

它调用下面的 usersController.preReviewView(),它调用 Ajax 实用程序的 oncomplete()。

public void preRenderView() {
        Ajax.oncomplete("document.getElementById('menuBarForm:btnLogout').click();");
}

目前在生产中,上面的 javascript 按设计工作;这个 javascript 调用如下。

    <script>window.onbeforeunload = function() { document.getElementById('menuBarForm:btnLogout').click(); }</script>

那么,为什么 javascript 没有在客户端执行?

编辑:我不再需要此功能,因为我只是想出了解决原始问题的方法,但我希望能回答这个问题。谢谢。 :)

【问题讨论】:

  • 我无法在 MyFaces 或 Mojarra 中重现您的问题。为了排除一个和另一个,在 ajax 响应中是否存在 oncomplete 脚本? (检查浏览器的 webdeveloper 工具集中的 HTTP 流量日志)尝试用 alert('peek-a-boo') 替换以获得一些视觉反馈。
  • 我刚刚确认 Ajax.oncomplete() 即使在 preRenderView 事件期间/通过 preRenderView 事件执行时也能按设计工作。 OmniFaces 'Ajax' 实用程序用于'Ajax' 请求。我假设 OmniFaces Ajax.oncomplete() 会在 FPR(整页刷新或非 AJAX 请求)的 preRenderView 期间向客户端发送 javascript。感谢 BalusC 的回复。
  • 您更愿意使用&lt;h:outputScript target="body"&gt;&lt;o:onloadScript&gt;,具体取决于具体的功能需求。
  • 好主意/推荐!嗯,我只需要在一个 #{applicationScopeBean.property == true} 下执行 javascript,而且由于我使用的是 TomEE/OpenEJB,render="..." 非常昂贵,所以我宁愿包括这个通过 ui:include src="#{applicationScopeBean.property ? '/onloadScriptToFireAfterLogin.xhtml' : 'noOnloadScriptToFireAfterLogin.xhtml')}"。
  • 如有必要,您也可以在组件周围使用&lt;c:if&gt;

标签: ajax jsf omnifaces


【解决方案1】:

我刚刚确认 Ajax.oncomplete() 可以按设计工作,即使在 preRenderView 事件期间/通过 preRenderView 事件执行时也是如此。 OmniFaces 'Ajax' 实用程序用于'Ajax' 请求。我假设 OmniFaces Ajax.oncomplete() 会在 FPR(整页刷新或非 AJAX 请求)的 preRenderView 期间向客户端发送 javascript。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 1970-01-01
    • 2013-11-16
    • 2021-10-11
    相关资源
    最近更新 更多