Как установить атрибут maxlength на h: inputTextarea - PullRequest
23 голосов
/ 07 февраля 2011

Как я могу ограничить длину <h:inputTextarea>? Для <h:inputText> он отлично работает с атрибутом maxlength. Однако этот атрибут недоступен в <h:inputTextarea>.

Ответы [ 3 ]

35 голосов
/ 07 февраля 2011

HTML5 + JSF 2.2 +

Если вы используете HTML5 и JSF 2.2+, укажите его как атрибут passthrough .

<html ... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">

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

HTML5 + JSF 2.0 / 2.1

Если вы используете HTML5, но еще не JSF 2.2, используйте OmniFaces Html5RenderKit для распознавания новых атрибутов HTML5 в JSF 2.0 / 2.1.

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

HTML4

Если вы используете HTML4, то он уже не поддерживается самим HTML. Он поддерживается только для элемента <input>, но не для элемента <textarea>. По этой же причине в JSF-представлении этого HTML-элемента такого атрибута нет. Вы должны решить это требование на стороне клиента, используя 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));
    }
});
6 голосов
/ 07 февраля 2011
<h:inputTextarea  required="true" cols="50" rows="5" id=”aboutMe” value="#{person.aboutMe}”>
          <f:validateLength maximum="400" minimum="20"/>
    </h:inputTextarea>
3 голосов
/ 14 февраля 2012

Ответ BalusC хороший, но, пожалуйста, имейте в виду, что валидатор JSF, вызванный с помощью f:validateLength maximum="2000" />, будет считать символы новой строки дважды, тогда как $textarea.val().length будет считать их только один раз. Вам нужно будет дважды считать разрывы новой строки в вашем валидаторе JavaScript, если вы хотите, чтобы два валидатора возвращали одинаковые результаты для многострочных входных данных.

Примером этой проблемы может быть ввод "Hello\nWorld" в вашей текстовой области, где \ n - это разрыв строки. Валидатор JSF будет считать 12 символов, но $textarea.val().length вернет только 11. Это несоответствие, очевидно, усугубится, если вы позволите пользователю вводить несколько абзацев.

Хотя и не о том же предмете, первые пара абзацев этой статьи объясняют поведение JavaScript. Есть также некоторые комментарии об этой конкретной проблеме, которые могут быть полезны.

...