バグかどうかわからない、奇妙な問題に遭遇しました。基本的に、現在の更新が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" に移動し、値を入力します。ここでは問題ありません。
- 次に、カーソルが次のフィールド id = "c" に移動することを期待して、もう一度 Tab キーを押します。しかし、それは起こりません。フィールド id="c" の値のみが更新され、どこかでフォーカスが失われます。フォーカスが失われている間にもう一度 Tab キーを押すと、フォーカスは id = "a" (または最初のフィールド) に移動します。
- Tab キーを使用せずにマウス クリックを使用しても、フィールド id = "b" で id="c" をクリックすると、フォーカスも失われます。
- フィールド id="b" update から "c" を削除して update="d" にすると、フォーカスはフィールド id="c" に残りますが、問題は、それが更新されないことです。 「c」の計算値。
結論として、現在のフィールドが ajax イベントを実行して update="nextfield" を介して次のフィールドを更新する場合、次のフィールドはタブキーまたは次にクリックされたマウスでフォーカスできないと言えると思います。マウスを 2 回クリックすると、フォーカスが次のフィールドに移動しますが、これは面倒です。ただし、すぐ次のフィールドの後のすべてのフィールドを更新しても、すぐ次のフィールドにフォーカスを正しく置くことができます。
これは本来あるべき姿ですか?この場合、実際に次のフィールドにフォーカスを移すにはどうすればよいでしょうか?
(PrimeFaces 3.2)