【问题标题】:Need suggestion regarding customizing textarea max length function需要有关自定义 textarea 最大长度功能的建议
【发布时间】:2012-05-03 05:10:37
【问题描述】:

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

谢谢

【问题讨论】:

    标签: javascript jquery jsf-2


    【解决方案1】:

    每次按下按键时,您都会附加一个新的按键事件侦听器。这是没有意义的。您需要或者直接在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() 函数附加它,那么你必须自己在函数中指定限制。

    例如

    <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 的限制与您在服务器端 &lt;f:validateLength&gt; 验证器中的限制不匹配。

    【讨论】:

    • HHmm 你能告诉我一件事吗?如果我想在我的函数中使用事件对象,我该如何使用它?就像我只是将元素和限制传递给我的功能。我也可以将事件对象传递给我的函数,例如onkeyup="limitTextArea(this, 400, event)" 。谢谢
    • 实际上我使用了event.which,因为在达到最大限制后,如果我按任意键,那么您会在 textarea 中感觉到一些不稳定的行为。就像 textarea 试图爬到顶部,或者试图阻止你写。它的滚动条轻微晃动。这就是我使用event.which 的原因,因此用户一旦达到最大限制就无法按键
    • 和使用按键的原因相同。如果我使用 keyup 事件,那么当您在达到最大限制后按下键时,您会感到轻微的摇晃行为。是的,它不匹配:) 我会更正它,因为我正在测试并专注于该功能,所以我保持原样。事实上,我通过在这个论坛上阅读你的一个答案来使用这种方法;)。谢谢:)
    猜你喜欢
    • 2013-02-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 2014-08-02
    • 2016-07-16
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    相关资源
    最近更新 更多