我遇到了一个奇怪的问题,不确定这是否是一个bug。基本上,如果当前通过ajax更新下一个,那么焦点将跳过下一个。
要复制该问题,您可以使用以下bean:
public class TestBean implements Serializable {
private BigDecimal a;
private BigDecimal b;
private BigDecimal c;
//
public TestBean() {
}
public BigDecimal getA() {
return a;
}
public void setA(BigDecimal a) {
this.a = a;
}
public BigDecimal getB() {
return b;
}
public void setB(BigDecimal b) {
this.b = b;
}
public BigDecimal getC() {
return c;
}
public void setC(BigDecimal c) {
this.c = c;
this.calculate();
}
public void calculate() {
if (a != null && b != null)
c = a.multiply(b);
}
}
以及下面的xhtml
<p:inputText id="a" value="#{testBean.a}" style="text-align:right">
<p:ajax event="blur" listener="#{testBean.calculate}" update="c d"/>
</p:inputText>
<p:inputText id="b" value="#{testBean.b}" style="text-align:right">
<p:ajax event="blur" listener="#{testBean.calculate}" update="c d"/>
</p:inputText>
<p:inputText id="c" value="#{testBean.c}" style="text-align:right">
</p:inputText>
<p:inputText id="d" value="#{testBean.c}"/>
- 首先,我将单击字段id="a",id="a)将获得焦点,然后我将键入一些值。这里没问题
- 然后,我将按tab键将光标移动到下一个字段,id="b",并键入一些值。这里没问题
- 然后,我将再次按下tab键,期望光标移动到下一个字段,id="c"。但这并没有发生。只有字段id="c"的值被更新,焦点在某个位置丢失。当焦点丢失时,如果我再次按下tab键,焦点将移动到id="a"(或第一个字段)
- 即使我不使用制表键,而是使用鼠标单击,如果我现在在字段id="b"并单击id="c",焦点也会丢失
- 如果我从字段id="b"更新中删除"c",使其更新为update="d",那么重点将放在字段id="c"上,但问题是,它不会用计算值"c"更新
总之,我相信我可以说,如果当前字段通过update="nextfield"运行ajax事件来更新下一个字段,那么,下一个域就不能通过tab键或下一个鼠标点击来聚焦。第二次鼠标点击会将焦点转移到下一个字段,但这很乏味。然而,我可以在下一个字段之后更新所有字段,并且仍然可以将焦点正确地放在下一字段上。
应该是这样吗?在这种情况下,如何将焦点真正转移到下一个领域?
(PrimeFaces 3.2)
当update
发生时,HTML会为c
和d
更新,因此光标不能集中在这些元素上。不确定您是想使用一些事后JavaScript来设置焦点,还是只是接受这种行为。