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

Comment puis-je limiter la longueur de <h:inputTextarea>? <h:inputText> il fonctionne très bien avec maxlength l'attribut. Cependant, cet attribut n'est pas disponible dans <h:inputTextarea>.

21
demandé sur BalusC 2011-02-07 19:15:56

3 réponses

HTML5 + JSF 2.2+

si vous utilisez HTML5 et JSF 2.2+, spécifiez un 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 de nouveaux attributs HTML5 en JSF 2.0/2.1.

<h:inputTextarea value="#{bean.text}" maxlength="2000" />

HTML4

si vous êtes sur HTML4, alors il n'est déjà pas supporté par HTML lui-même. C'est uniquement pris en charge sur <input> élément, pas sur <textarea> élément. C'est aussi la raison pour laquelle il n'y a pas d'attribut de ce genre dans la représentation JSF de cet élément HTML. Vous devez résoudre cette exigence du côté client en utilisant JS et/ou du 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 pour le cas où le client aurait 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 pouvez faire de jQuery

$('textarea.max').keyup(function() {
    var $textarea = $(this);
    var max = 2000;
    if ($textarea.val().length > max) {
        $textarea.val($textarea.val().substr(0, max));
    }
});
34
répondu BalusC 2015-08-04 14:55:30
<h:inputTextarea  required="true" cols="50" rows="5" id=”aboutMe” value="#{person.aboutMe}”>
          <f:validateLength maximum="400" minimum="20"/>
    </h:inputTextarea>
5
répondu Jigar Joshi 2011-02-07 16:18:47

la réponse de BalusC est bonne, mais attention au validateur JSF, invoqué avec f:validateLength maximum="2000" />, comptera deux fois les nouveaux caractères tandis que $textarea.val().length comptera seulement une fois. Vous devrez compter deux fois les sauts de ligne dans votre validateur JavaScript si vous voulez 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 compterait 12 caractères par le validateur JSF, mais $textarea.val().length ne renvoie 11. Cette divergence va évidemment empirer si vous laissez l'utilisateur entrer plusieurs paragraphes.

bien qu'il ne s'agisse pas du même sujet, les premiers paragraphes de l'article a une explication pour le comportement JavaScript. Il y a aussi des commentaires sur cette question précise qui pourraient être utiles.

3
répondu user1018494 2012-02-14 17:08:07