在我的项目中有8个文本框和一个命令按钮。当我按下命令按钮onfocus
属性不起作用时。所以我尝试使用p:focus
,这些都没有按预期工作。
<p:commandButton value="Test1" action="#{test.testAction1}" update="mainPanel">
<p:focus for="textField"/>
</p:commandButton>
我是否需要p:commandButton
的属性onfocus
来关注特定组件?
答案 0 :(得分:2)
如何专注
首先必须区分两个不同的主题:
由几个组件提供的onfocus
属性用于对焦点事件做出反应(当给定组件接收到焦点时发生)。在焦点上,提供的JavaScript称为客户端。
PrimeFaces元素p:focus
用于控制焦点。有一个自动/隐式(a)和一个显式模式(b):
一个。 <p:focus />
将焦点设置为第一个输入元素。这也是一种验证感知方式,它将焦点放在第一个无效字段上。
湾<p:focus for="..." />
会导致具有给定ID的组件获得焦点。
使焦点控制工作:
不要将p:focus
放在组件元素中,只需将其放置即可。在第一个之前,
对于AJAX请求,update
也是p:focus
元素。
以下是一个小例子:
<h:form>
<p:focus for="textField-#{exampleForm.focusedIndex}"/>
<p:inputText id="textField-1" /><br />
<p:inputText id="textField-2" /><br />
<p:inputText id="textField-3" /><br />
<p:inputText id="textField-4" /><br />
<p:inputText id="textField-5" onfocus="alert('last field focused.');" /><br />
<p:commandButton value="Up" update="@form" action="#{exampleForm.decrementFocus()}" />
<p:commandButton value="Down" update="@form" action="#{exampleForm.incrementFocus()}" />
</h:form>
相应的bean:
import java.io.Serializable;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
@Named
@ViewScoped
public class ExampleForm implements Serializable {
private static final int MIN_INDEX = 1;
private static final int MAX_INDEX = 5;
private int focusedIndex = 1;
public int getFocusedIndex() {
return focusedIndex;
}
public void setFocusedIndex(final int focusedIndex) {
this.focusedIndex = focusedIndex;
}
public void incrementFocus() {
if (focusedIndex < MAX_INDEX)
focusedIndex++;
}
public void decrementFocus() {
if (focusedIndex > MIN_INDEX)
focusedIndex--;
}
}
另见: