我想要一个链接,当用户点击它时,它应该执行以下操作:
我不知道如何解决这个问题
当我保存密钥并打开新窗口时,密钥为空。
也许保存钥匙的过程太慢了?
以及如何防止页面重新加载?
这是我目前的代码:
的JavaScript
function openWin2(url)
{
var w = 800;
var h = window.innerHeight - 100;
var left = ((screen.width-w)/2);
var top = ((screen.height-h)/2);
window.open(url, 'Tax', 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+top+', left='+left);
}
XHTML
<ui:repeat value="#{main.list}" var="items">
<h:commandLink action="#{main.setClickedId(items.itemId)}">
<table onclick="openWin2('immobilie.xhtml')"><tr><td>Hello</td></tr></table>
</h:commandLink>
</ui:repeat>
ManagedBean
保存的
public void setClickedId(String clickedId) {
this.clickedId = clickedId;
FacesContext context = FacesContext.getCurrentInstance();
Map<String, Object> map = context.getExternalContext().getSessionMap();
if(map.containsKey("id")){map.remove("id");}
map.put("id", clickedId);
}
加载
FacesContext context = FacesContext.getCurrentInstance();
immoId = context.getExternalContext().getSessionMap().get("id").toString();
答案 0 :(得分:0)
我建议使用a4j:ajax
标记(RichFaces中提供,文档here)。那么xhtml中的标记应如下所示:
<h:commandLink action="#{main.setClickedId(items.itemId)}">
<table><tr><td>Hello</td></tr></table>
<a4j:ajax oncomplete="openWin2('immobilie.xhtml')" />
</h:commandLink>
这段代码将向服务器发送一个AJAX请求,该请求将执行方法setClickedId
,当响应返回浏览器时,将调用函数openWin2
。
答案 1 :(得分:0)
当我保存密钥并打开新窗口时,密钥为空。也许保存密钥的过程太慢了?
这里的问题是JavaScript和服务器端方法在不同的地方运行:
JavaScript代码在客户端浏览器中运行,就像在您的电脑中本地执行代码一样。
服务器端代码在服务器上运行。浏览器必须向服务器发出请求,服务器将完成其工作并执行action
<h:commandLink>
中定义的方法,然后向浏览器返回响应。浏览器将处理响应。注意:这是一个非常基本的解释,有关JSF请求的更多信息,请阅读JSF Lifecycle and Custom components
知道这一点,并不是说方法执行太慢,而是在不同的时间执行。
如何阻止页面重新加载?
简而言之,您必须向服务器发出ajax请求,而不是完整请求。为实现这一目标,JSF 2为您提供<f:ajax>
,它将简单的请求转换为ajax请求,浏览器不会刷新页面。
解决方案应分为两个步骤:
执行服务器操作以将会话中的数据保存为ajax请求。
处理完ajax请求后,您应该使用JavaScript打开窗口。
<f:ajax>
组件本质上不提供oncomplete
javascript方法,但您可以使用onevent
方法的强大功能在完成ajax后执行javascript代码请求。该示例基于JSF 2.0 javascript onload/oncomplete。
<h:commandLink action="#{main.setClickedId(items.itemId)}" value="Hello">
<f:ajax onevent="handleOnComplete" />
</h:commandLink>
<h:outputScript>
function handleOnComplete(e) {
if (e.status == 'success') {
openWin2();
}
}
</h:outputScript>
另一种方法是使用第三方库,如RichFaces的<a4j:commandLink>
或PrimeFaces的<p:commandLink>
。我将使用PrimeFaces代码发布样本:
<p:commandLink action="#{main.setClickedId(items.itemId)}" value="Hello"
oncomplete="openWin2()" />
答案 2 :(得分:0)
我自己发现了失败 问题是,JSF Page没有解析JSF标签 从:
<h:outputText value="#{items.itemId" />
我没有得到任何输出
这就是为什么我认为JSF页面在调用方法时失败了。
但这不是问题。问题是我的网址。这是我打开第二页的代码:
openWin2('immobilie.xhtml')
但那是错的。它必须是
openWin2('faces/immobilie.xhtml')
我从here获得了解决方案。
<小时/> Luiggi Mendoza非常感谢你帮助我!你非常帮助我!