Как ограничить длину <h:inputTextarea>
? Для <h:inputText>
он отлично работает с атрибутом maxlength
. Однако этот атрибут недоступен в <h:inputTextarea>
.
Как установить атрибут maxlength на h: inputTextarea
Ответ 1
HTML5 + JSF 2. 2+
Если вы используете HTML5 и JSF 2. 2+, укажите его как сквозной атрибут.
<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));
}
});
Ответ 2
<h:inputTextarea required="true" cols="50" rows="5" id="aboutMe" value="#{person.aboutMe}">
<f:validateLength maximum="400" minimum="20"/>
</h:inputTextarea>
Ответ 3
Ответ на BalusC хорош, но, пожалуйста, будьте осторожны, проверщик JSF, вызванный с помощью f:validateLength maximum="2000" />
, будет считать новые строковые символы дважды, тогда как $textarea.val().length
будет считать их только один раз. Вам нужно будет удвоить количество разрывов новой строки в вашем валидаторе JavaScript, если вы хотите, чтобы два валидатора возвращали одинаковые результаты для многострочных входов.
Примером этой проблемы будет вход "Hello\nWorld"
в вашей текстовой области, где \n - это разрыв строки. Это будет считаться 12 символами с помощью проверки достоверности JSF, но $textarea.val().length
будет возвращать только 11. Это несоответствие, очевидно, ухудшится, если вы позволите пользователю ввести несколько абзацев.
Хотя не о том же предмете, в первой параграфах этой статьи есть объяснение поведения JavaScript. Также есть некоторые комментарии к этой точной проблеме, которая может быть полезной.