24

我怎样才能限制的长度<h:inputTextarea>?因为<h:inputText>它适用于maxlength属性。但是,此属性在 中不可用<h:inputTextarea>

4

3 回答 3

37

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来识别 JSF 2.0/2.1 中的新 HTML5 属性。

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

HTML4

如果您使用的是 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));
    }
});
于 2011-02-07T18:23:28.360 回答
6
<h:inputTextarea  required="true" cols="50" rows="5" id=”aboutMe” value="#{person.aboutMe}”&gt;
          <f:validateLength maximum="400" minimum="20"/>
    </h:inputTextarea>
于 2011-02-07T16:18:47.063 回答
3

BalusC 的回答很好,但请注意,使用 调用的 JSF 验证器f:validateLength maximum="2000" />将计算换行符两次,而$textarea.val().length只会计算一次。如果您希望两个验证器为多行输入返回相同的结果,则需要对 JavaScript 验证器中的换行符进行双重计算。

此问题的一个示例是"Hello\nWorld"在您的文本区域中输入 of,其中 \n 实际上是换行符。这将被 JSF 验证器计为 12 个字符,但$textarea.val().length只会返回 11 个。如果您让用户输入多个段落,这种差异显然会变得更糟。

虽然不是同一个主题,但本文的前几段对JavaScript 行为进行了解释。还有一些关于这个确切问题的评论可能有用。

于 2012-02-14T17:08:07.360 回答