web-dev-qa-db-fra.com

Comment définir l'attribut maxlength sur h: inputTextarea

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>.

23
sergionni

HTML5 + JSF 2.2+

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" />

HTML5 + JSF 2.0/2.1

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" />

HTML4

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));
    }
});
36
BalusC
<h:inputTextarea  required="true" cols="50" rows="5" id=”aboutMe” value="#{person.aboutMe}”>
          <f:validateLength maximum="400" minimum="20"/>
    </h:inputTextarea>
6
Jigar Joshi

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.

3
user1018494