需要有关自定义textarea最大长度功能的建议

时间:2012-05-03 05:10:37

标签: javascript jquery jsf-2

我正在使用限制textArea长度的函数。虽然功能表现不错,但我想问一下我是否以正确的方式调用功能?

这是

<h:inputTextarea id="questionInputTextArea"
                 value="#{faqAddUpdate.question}"
                 cols="50"
                 rows="3"
                 disabled="#{faqAddUpdate.buttonState}"
                 onkeypress="limitTextArea(this, 400)"
                 style="overflow: auto;">

   <f:validateLength maximum="200" />

</h:inputTextarea>

这是函数

function limitTextArea(element, limit) {

    var $textArea = $(element);     //casting to jQuery so we can use jQuery functions on it
    ($textArea).keypress(function(event){

        if (event.which < 0x20) {

            // e.which < 0x20, then it's not a printable character
            // e.which === 0 - Not a character
            return;     // Do nothing

        }

        if ($textArea.val().length == limit) {
            event.preventDefault();
        } else if ($textArea.val().length > limit) {

            // Maximum exceeded
            $textArea.val() = $textArea.val().substr(0, limit);
        }

    }); //end of keypress

} //end of function()

令我困惑的是这个,我在我的jsf代码中使用 onkeypress ,在函数中我也说($ textArea).keypress(function(event) 。如何优化此功能?或者我做得对吗?

由于

1 个答案:

答案 0 :(得分:0)

每次按下某个键时,您都会附加一个新的按键事件侦听器。这毫无意义。您需要 直接在onkeypress属性,中指定它,以便在文档就绪后通过jQuery方式附加它。此外,对val()函数的赋值没有意义,您需要将新值作为参数传递。这可能不可能“表现良好”。最后,我还建议使用keyup而不是keypress,以便仅在更新textarea的值后调用该函数,从而更加明智限制功能的行为。这样您也不需要检查不可打印的字符范围。

总而言之,它可能看起来像这样:

function limitTextArea(element, limit) {
    var $textArea = $(element);

    if ($textArea.val().length > limit) {
        $textArea.val($textArea.val().substr(0, limit));
    }
} 

将被注册为

<h:inputTextarea ... onkeyup="limitTextArea(this, 400)" />

如果你真的需要通过jQuery keyup()函数附加它,那么你必须自己在函数中指定限制。

E.g。

<h:inputTextarea ... styleClass="limit" />

$("textarea.limit").keyup(function() {
    var $textarea = $(this);
    var limit = 400;

    if ($textarea.val().length > limit) {
        $textarea.val($textarea.val().substr(0, limit));
    }
});

(您在$(document).ready(function() {...})$(function() {...});期间执行)


或者您可以将限制指定为类名的一部分并相应地提取它:

<h:inputTextarea ... styleClass="limit_400" />

有这样的东西

$("textarea[class*=limit_]").each(function(i, textarea) {
    var classNames = textarea.className.split(' ');
    var limit = 0;

    for (var i = 0; i < classNames.length; i++) {
        if (classNames[i].indexOf("limit_") == 0) {
            limit = parseInt(classNames[i].split("_")[1]);
            break;
        }
    }

    if (limit) {
        $(textarea).keyup(function() {
            var $textarea = $(this);

            if ($textarea.val().length > limit) {
                $textarea.val($textarea.val().substr(0, limit));
            }
        });
    }
});

顺便说一句,400的限制与您在服务器端<f:validateLength>验证程序中的限制不匹配。