有没有办法在使用Primefaces RequestContex调用其他组件的函数后设置我的组件焦点?
我试过了:
RequestContex.getCurrentInstance().execute("PF('WidgetVar').focus();");
和
RequestContex.getCurrentInstance().execute("(((InputText) event.getComponent()).getWidgetVar()).focus();");
我没有收到错误但没有任何反应。
我错过了什么或者这是不可能的?
我使用的是Primefaces 4.0.3和MyFaces 2.0.2
编辑示例代码
豆
import java.io.Serializable;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import org.primefaces.context.RequestContext;
public class NavigationBean implements Serializable {
private static final long serialVersionUID = 1L;
private String input;
public NavigationBean() {}
@PostConstruct
public void init() {
}
public void goNext() {
Logger.getAnonymousLogger().warning("GONEXT");
RequestContext.getCurrentInstance().scrollTo("w3");
}
public String getInput() {
return input;
}
public void setInput(String input) {
this.input = input;
}
}
XHTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body >
<h:form id="form">
<h:inputText id="input1" value="#{navigationBean.input}" widgetVar="w1"></h:inputText>
<h:inputText id="input2" value="#{navigationBean.input}" widgetVar="w2"></h:inputText>
<h:inputText id="input3" value="#{navigationBean.input}" widgetVar="w3"></h:inputText>
<h:inputText id="input4" value="#{navigationBean.input}" widgetVar="w4"></h:inputText>
<p:commandButton value="focus" action="#{navigationBean.goNext()}" />
</h:form>
</h:body>
</html>
答案 0 :(得分:4)
你可以使用来自primefaces的<p:focus>
标签,我用它在运行时设置焦点如下:
.xhtml代码:
<p:focus id="focusID" for="#{yourBean.focusProperty}" />
.java代码:
focusProperty="componentIDToSetFocus";
请勿忘记更新<p:focus>
代码
答案 1 :(得分:2)
如果上一个答案不起作用,您可以创建一个js函数,例如:
function focusField(id){
$(id).focus();
}
然后在你的bean中,假设你想把焦点集中在字段&#34; input4&#34; ,它代表ID而不是Widgetvar
RequestContext.getCurrentInstance().execute("focusField('#input4');");
答案 2 :(得分:1)
使用PrimeFaces 6.1,由于原因未知,我无法获得主要的p:焦点工作。所以,我刚刚实现了一个onload JQuery函数来将焦点设置为p:commandButton。对于onload调用,将jQuery嵌套函数放在&#39; body&#39;中。这是为了确保覆盖任何其他主要的onload函数。
<script>
jQuery(document).ready(function () {
jQuery(document).ready(function () {
// twice in document.ready to
// execute after Primefaces callbacks
PF('widget_home_page_form_command_button').getJQ().focus();
});
});
</script>
PrimeFaces为所有主要组件创建widgetVar组件。虽然widgetVar可以使用某些功能,例如禁用或启用。但是,我不得不使用getJQ()函数来获取jQuery对象,并使用该对象将焦点设置在命令按钮上。
答案 3 :(得分:0)
看起来你在这里有几个误解:
您可以在RequestContext
API中执行 Java 代码。
RequestContext.getCurrentInstance().execute("(((InputText) event.getComponent()).getWidgetVar()).Focus();");
你做不到。上面的代码不起作用。 execute
仅适用于 JavaScript 。
您要查找的函数名称为focus()
。 JS区分大小写。所以Focus <> focus
。所以我认为你应该拥有的是
RequestContext.getCurrentInstance().execute("yourClientSideId.focus();");
yourClientSideId
应该与您感兴趣的组件的widgetVar
属性相对应。我不确定您在代码中引用的PF
对象是什么成为。我从未见过它。也许你的意思是PrimeFaces
对象?
如果上述情况失败,您可以随时使用scrollTo
上的RequestContext
方法:
RequestContext.getCurrentInstance().scrollTo("yourComponentWidgetVar");