我有一个最有趣的问题,试图找出如何获得JavaScript有条件地调用时登录我正在工作的应用程序。基本上,我只希望在用户成功登录时显示一个JavaScript弹出消息。
在我的xhtml页面中,我有以下测试JavaScript函数,然后我有一个命令按钮如下:
<script type="text/javascript">
function hello() {
alert("Hello from PrimeFaces calling JavaScript on the page");
}
</script>
<-- Other html code -->
<p:commandButton id="login" value="Login" update="out" action="#{login.login}" styleClass="button"/>
然后在我的bean中,我有以下代码:
public String login() {
// Other code
// return "login" on failure - go back to login.xhtml
// On success do the following:
RequestContext context = RequestContext.getCurrentInstance();
context.execute("hello()");
return "option" + optNum; // Go on to option?.xhtml where ? = 1, 2, or 3
}
现在我的JavaScript函数只应该在屏幕上弹出一个测试消息,但如果我能让它工作,我想要显示一些更有用的东西。
其思想是,如果登录失败,登录页面将再次显示错误消息,这可以正常工作。如果登录成功,应用程序将导航到optNum给出的页码。这也可以正常工作。但是,在它导航到下一页之前,我希望它显示弹出消息,然后在JavaScript消息中单击"确定",然后应该导航到该页。
相反,没有弹出窗口显示,它直接进入所需的页面,所以看起来好像它在有机会执行JavaScript之前就从页面导航出去了。如果我替换 ,这将得到确认。return "option" + optNum;
// by
return "";
方法末尾的,因为弹出消息会在不尝试导航到下一页的情况下显示,并在单击"确定"后停留在该页上。然而,由于某种原因,我不明白为什么,有时它导航到所需的页面时,第二次点击按钮。
在从页面导航离开之前,我如何获得执行JavaScript的代码?把JavaScript放在它要导航到的页面上或资源中是行不通的。
有人知道怎么帮我吗?多谢。
为什么不能在用户登录页上只使用<body onload="hello()">
?或者你可以用PrimeFaces效果组件做得更好。
你做错了,你的导航不是在登录时发生的,而是在点击'OK'按钮时发生的。
您可以使用p: dialog来显示JSF弹出窗口。
<p:commandButton id="login" value="Login" update="out"
action="#{login.login}" styleClass="button"/>
<p:dialog visible="#{login.loginSuccess}">
<h:commandButton action="#{navigateToInbox}" value="ok" />
</p:dialog>
…
public String login() {
// Other code
// return "login" on failure - go back to login.xhtml
if(successfulLogin)
loginSuccess = true;
}
查看演示,了解如何使用dialog with primefaces,
http://www.primefaces.org/showcase/ui/dialog.jsf