我正在开发一个 jsf 应用程序,该应用程序在某个时间需要在新选项卡中打开外部页面,使第一页保持活动状态。我需要找到一种方法,只需单击一个按钮即可使应用程序执行:
- 在新选项卡中重定向到外部 URL
- 在原始页面中禁用按钮本身的操作
我尝试过使用<outputLink />
但它没有action属性。
我尝试过使用<commandLink />
但它无法重定向到外部。
我也尝试过<commandLink />
with target="_blank"
以及在支持 bean 中编码的重定向:
<h:commandLink onclick="submit();" target="_blank" action="#{myBean.execute}" disabled="#{myBean.linkDisabled}" value="external link" />
并且,在支持 bean 中:
public String execute() {
linkDisabled = true;
try{
ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
externalContext.redirect(Constants.EXTERNAL_URL);
} catch(Exception e){
throw new FacesException("Redirection failed");
}
return THIS_PAGE;
}
页面在新选项卡中打开,但它是当前页面而不是带有 URL 的页面Constants.EXTERNAL_URL
并且该按钮仍处于启用状态。没有显示错误消息。有什么建议吗?
预先感谢,安德里亚
你的问题令人困惑。您混合了“链接”和“按钮”。您基本上需要通过 JavaScript 禁用客户端中的元素,因为响应不会返回到当前浏览器窗口/选项卡,而是返回到不同的浏览器窗口/选项卡。在 JavaScript 中,禁用按钮很容易,但禁用链接则不然。为简单起见,我假设您的意思是并且可以使用<h:commandButton>
这是当前表单中唯一的按钮。
要解决您的问题,您需要删除onclick="submit()"
(因为它扰乱了默认行为)并且您需要删除导航结果(这应该不重要,但在某些 JSF 实现中您永远不知道)并且您需要通过 JS 在客户端禁用该按钮。
所有代码应该如下所示:
<h:form target="_blank">
<h:commandButton
value="external"
action="#{myBean.execute}"
onclick="setTimeout('document.getElementById(\'' + this.id + '\').disabled=true;', 50);" />
</h:form>
And
public void execute() throws IOException {
FacesContext.getCurrentInstance().getExternalContext().redirect(Constants.EXTERNAL_URL);
}
The setTimeout()
是必要的,因为在发送表单数据之前按钮将被禁用,这将导致按钮自己的名称=值对不会作为请求参数发送,因此 JSF 将不会调用任何操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)