【发布时间】: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 的回复。
-
您更愿意使用
<h:outputScript target="body">或<o:onloadScript>,具体取决于具体的功能需求。 -
好主意/推荐!嗯,我只需要在一个 #{applicationScopeBean.property == true} 下执行 javascript,而且由于我使用的是 TomEE/OpenEJB,render="..." 非常昂贵,所以我宁愿包括这个通过 ui:include src="#{applicationScopeBean.property ? '/onloadScriptToFireAfterLogin.xhtml' : 'noOnloadScriptToFireAfterLogin.xhtml')}"。
-
如有必要,您也可以在组件周围使用
<c:if>。