0

我正在使用一个限制 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)。我该如何优化这个函数?或者我做得对?

谢谢

4

1 回答 1

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)" />

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

例如

<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() {...})or期间执行$(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>

于 2012-05-03T05:54:05.197 回答