特定のinputTextに検証エラーがある場合、JSFのinputTextフィールドにフォーカスを設定したいと考えています。どうすればこれを実装できますか?
inputText の validatorMessage はすぐにこれを行うと思いましたが、そうではないようです。
特定のinputTextに検証エラーがある場合、JSFのinputTextフィールドにフォーカスを設定したいと考えています。どうすればこれを実装できますか?
inputText の validatorMessage はすぐにこれを行うと思いましたが、そうではないようです。
そのようなデフォルトの動作はありません。自分で実装するか、サードパーティのライブラリを使用する必要があります。基本的に、レンダリングレスポンス中に、すべてのUIInput
コンポーネントの送信済みフォームを調べて、最初にisValid()
返されるフォームを見つけ、false
そのクライアントIDをリクエストマップに保存して、JS変数として出力できるようにする必要があります。
form.visitTree(VisitContext.createVisitContext(), new VisitCallback() {
@Override
public VisitResult visit(VisitContext context, UIComponent component) {
if (component instanceof UIInput && !((UIInput) component).isValid()) {
context.getFacesContext().getExternalContext().getRequestMap()
.put("focus", component.getClientId(context.getFacesContext()));
return VisitResult.COMPLETE;
}
return VisitResult.ACCEPT;
}
});
次に、次のスクリプトを使用してフォーカスを設定できます。
<h:outputScript target="body">
var focus = '#{focus}';
if (focus) {
document.getElementById(focus).focus();
}
</h:outputScript>
JSFユーティリティライブラリOmniFacesには、このための再利用可能なコンポーネントがあります<o:highlight>
(ソースコードはこちら、ショーケースデモはこちら)。さらに、無効化された入力にスタイルクラスを設定して、たとえばCSSで別の背景色を指定できるようにします。