Comment puis-je limiter la longueur de <h:inputTextarea>
? Pour <h:inputText>
cela fonctionne très bien avec l'attribut maxlength
. Cependant, cet attribut n'est pas disponible dans <h:inputTextarea>
.
Si vous utilisez HTML5 et JSF 2.2+, spécifiez-le comme attribut passthrough .
<html ... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
<h:inputTextarea value="#{bean.text}" a:maxlength="2000" />
Si vous utilisez HTML5, mais pas encore JSF 2.2, utilisez OmniFacesHtml5RenderKit
pour reconnaître les nouveaux attributs HTML5 dans JSF 2.0/2.1.
<h:inputTextarea value="#{bean.text}" maxlength="2000" />
Si vous utilisez HTML4, il n'est pas déjà pris en charge par HTML lui-même. Il n'est pris en charge que sur <input>
élément, pas sur <textarea>
élément. C'est aussi pourquoi il n'y a pas un tel attribut sur la représentation JSF de cet élément HTML. Vous devez résoudre cette exigence côté client en utilisant JS et/ou côté serveur en utilisant JSF. JS vous permet de valider instantanément la longueur et d'ignorer tous les autres caractères. JSF vous permet de le valider également dans le cas où le client a désactivé ou piraté le code JS. Le mieux serait une combinaison des deux.
En supposant que vous avez
<h:inputTextarea value="#{bean.text}" styleClass="max">
<f:validateLength maximum="2000" />
</h:inputTextarea>
voici comment vous pourriez faire le 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>
La réponse de BalusC est bonne, mais sachez que le validateur JSF, appelé avec f:validateLength maximum="2000" />
, Comptera deux fois les nouveaux caractères de ligne tandis que $textarea.val().length
ne les comptera qu'une seule fois. Vous devrez doubler le nombre de sauts de nouvelle ligne dans votre validateur JavaScript si vous souhaitez que les deux validateurs retournent les mêmes résultats pour les entrées multilignes.
Un exemple de ce problème serait une entrée de "Hello\nWorld"
Dans votre zone de texte, où\n est en fait un saut de ligne. Cela serait compté comme 12 caractères par le validateur JSF, mais $textarea.val().length
ne retournerait que 11. Cette différence va évidemment empirer si vous laissez l'utilisateur entrer plusieurs paragraphes.
Bien qu'il ne s'agisse pas du même sujet, les deux premiers paragraphes de l'article this expliquent le comportement JavaScript. Il y a aussi quelques commentaires sur ce problème précis qui peuvent être utiles.