0

我在尝试弄清楚如何在登录我正在处理的应用程序时有条件地调用 JavaScript 时遇到了一个最有趣的问题。基本上,我只希望在用户成功登录时显示 JavaScript 弹出消息。

在我的 xhtml 页面中,我有以下测试 JavaScript 函数,然后我有一个 commandButton,如下所示:

  <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 放在它将导航到的页面或资源中不起作用。

有人知道如何帮助我吗?非常感谢。

4

2 回答 2

0

为什么不能只在用户登陆页面上使用?或者你可以使用 PrimeFaces效果组件<body onload="hello()">做得更好。

于 2013-04-10T12:59:18.383 回答
0

您做错了,您的导航不会在登录时发生,而是实际上是在单击“确定”按钮时发生的。

您可以使用 p:daialog 来显示 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;
}

查看展示以了解如何将对话与 primefaces 一起使用,

http://www.primefaces.org/showcase/ui/dialog.jsf

于 2013-04-10T14:40:13.073 回答