<h:inputTextarea>
の長さを制限するにはどうすればよいですか? <h:inputText>
の場合、maxlength
属性で正常に動作します。ただし、この属性は<h:inputTextarea>
では使用できません。
HTML5およびJSF 2.2+を使用している場合は、 パススルー属性 として指定します。
<html ... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
<h:inputTextarea value="#{bean.text}" a:maxlength="2000" />
HTML5を使用し、まだJSF 2.2を使用していない場合は、 OmniFacesHtml5RenderKit
を使用して、JSF 2.0/2.1の新しいHTML5属性を認識します。
<h:inputTextarea value="#{bean.text}" maxlength="2000" />
HTML4を使用している場合、HTML4は既にサポートされていません。 <input>
要素ではなく、<textarea>
要素でのみサポートされます。それが、このHTML要素のJSF表現にそのような属性がない理由でもあります。 JSを使用してクライアント側で、またはJSFを使用してサーバー側でこの要件を解決する必要があります。 JSを使用すると、長さを即座に検証し、他のすべての文字を無視できます。 JSFでは、クライアントがJSコードを無効化またはハッキングした場合にも検証できます。ベストは両方の組み合わせです。
あなたが持っていると仮定して
<h:inputTextarea value="#{bean.text}" styleClass="max">
<f:validateLength maximum="2000" />
</h:inputTextarea>
jQueryの実行方法は次のとおりです
$('textarea.max').keyup(function() {
var $textarea = $(this);
var max = 2000;
if ($textarea.val().length > max) {
$textarea.val($textarea.val().substr(0, max));
}
});
<h:inputTextarea required="true" cols="50" rows="5" id=”aboutMe” value="#{person.aboutMe}”>
<f:validateLength maximum="400" minimum="20"/>
</h:inputTextarea>
BalusCの答えは良いですが、_f:validateLength maximum="2000" />
_で呼び出されるJSFバリデーターは改行文字を2回カウントするのに対し、$textarea.val().length
は1回しかカウントしないことに注意してください。 2つのバリデーターが複数行の入力に対して同じ結果を返すようにする場合は、JavaScriptバリデーターで改行を二重にカウントする必要があります。
この問題の例は、テキスト領域への_"Hello\nWorld"
_の入力です。ここで、\ nは実際には改行です。これは、JSFバリデーターによって12文字としてカウントされますが、$textarea.val().length
は11のみを返します。この矛盾は、ユーザーに複数の段落を入力させると明らかに悪化します。
同じテーマについてではありませんが、 this の記事の最初の数段落にはJavaScriptの動作についての説明があります。役に立つかもしれないこの正確な問題に関するいくつかのコメントもあります。