如何限制<h:inputTextarea>
的长度?对于<h:inputText>
,它适用于maxlength
属性。但是,<h:inputTextarea>
中无法使用此属性。
答案 0 :(得分:35)
如果您使用的是HTML5和JSF 2.2+,请将其指定为passthrough attribute。
<html ... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
<h:inputTextarea value="#{bean.text}" a:maxlength="2000" />
如果您使用的是HTML5,但尚未使用JSF 2.2,请使用OmniFaces Html5RenderKit
识别JSF 2.0 / 2.1中的新HTML5属性。
<h:inputTextarea value="#{bean.text}" maxlength="2000" />
如果您使用的是HTML4,那么HTML本身就不支持它了。它仅在<input>
元素上受支持,而不在<textarea>
元素上受支持。这也是为什么这个HTML元素的JSF表示没有这样的属性。您需要使用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));
}
});
答案 1 :(得分:5)
<h:inputTextarea required="true" cols="50" rows="5" id=”aboutMe” value="#{person.aboutMe}”>
<f:validateLength maximum="400" minimum="20"/>
</h:inputTextarea>
答案 2 :(得分:3)
BalusC的答案很好,但请注意,使用f:validateLength maximum="2000" />
调用的JSF验证器将对新行字符进行两次计数,而$textarea.val().length
只计算一次。如果您希望两个验证器为多行输入返回相同的结果,则需要对JavaScript验证器中的换行符重复计算。
此问题的一个示例是文本区域中"Hello\nWorld"
的输入,其中\ n实际上是换行符。这将被JSF验证器计为12个字符,但$textarea.val().length
只返回11.如果您让用户输入多个段落,这种差异显然会变得更糟。
虽然不是同一主题,但this文章的前几段有JavaScript行为的解释。关于这个可能有用的确切问题也有一些评论。