1

検証の決定に基づいてコンポーネントを選択 (およびフォーカス) することを実装しようとしています。

例えば:

  • ログインフォーム (2 つの入力: ユーザー名、パスワード、1 つの送信ボタン)
  • 検証が失敗した場合、usernameフォーカス<h:inputText id="name">されます
  • 検証が失敗した場合、passwordフォーカス<h:inputSecret id="password">されます
  • ページは更新されません。送信はajaxボタンです

私が試したこと:

ajax呼び出しなし(これは正常に機能しています-componentId検証プロセスでBeanに設定され、ページの更新/送信ごとに選択/フォーカスされます):

$(document).ready(function() {
  document.getElementById('form:#{bean.componentId}').focus();
  document.getElementById('form:#{bean.componentId}').select();
});
...
<h:commandButton id="save" action="#{bean.save}" type="submit"/>

しかし ajax呼び出しでは:

function myFunc(data) {
  if (data.status == "success") {
    var element = document.getElementById('form:#{bean.componentId}');
    element.focus();
    element.select();
}}
...
<h:commandButton id="save" action="#{bean.save}" type="submit">
  <f:ajax execute="@form" render="@form" onevent="myFunc"/>
</h:commandButton>

この方法も機能していますが、問題はcomponentId同じです (Bean の作成中に初期化されるもの)。

このトピックに関連する以前の質問:

ajax送信ボタンを使用して、検証エラーのあるフィールドを選択/フォーカスするにはどうすればよいですか?

4

1 に答える 1

3

非 ajax 送信は、基本的にスクリプトを含むページ全体を再レンダリングします。ajax送信は、ページの一部のみを再レンダリングします。これは、特定のケースではフォーム自体のみです(<f:ajax render>属性によって制御されます)。スクリプトは明らかにフォームに配置されていないため、「古い」値が保持されます (EL#{}は Web サーバーで実行され、Web ブラウザーでは実行されないため、Web ブラウザーが HTML/JS コードを取得する時点で、EL は既に長く実行すると、JS コードを呼び出しても再実行されません)。

これらの EL 式を含むスクリプト ブロックも同じ形式で配置する必要があります。これにより、ajax 送信時にも更新されます。

于 2012-11-25T12:15:01.890 に答える