【问题标题】:How to prevent user to enter text in textarea after reaching max character limit如何防止用户在达到最大字符限制后在 textarea 中输入文本
【发布时间】:2012-05-02 13:09:02
【问题描述】:

一旦达到最大字符限制,我想阻止用户在 textarea 中输入文本。当我达到最大限制时发生了什么,然后我的文本区域滚动条移动到顶部,我以某种方式阻止了此代码。

jQuery(document).ready(function($) {
    $('textarea.max').keyup(function() {
        var $textarea = $(this);
        var max = 400;
        if ($textarea.val().length > max) {
            var top = $textarea.scrollTop();
            $textarea.val($textarea.val().substr(0, max));
            $textarea.scrollTop(top);

        }
    });
}); //end if ready(fn)

但我也希望在达到最大限制后用户无法在 textarea 中输入任何内容。目前,如果用户按住键达到最大限制后,字符会在文本区域中输入,尽管在释放按钮后它会返回原始文本(即 $textarea.val($textarea.val(). substr(0, 最大值));)。但我希望一旦这种情况成为现实

if ($textarea.val().length > max) {

用户无法输入任何内容。我希望光标从文本区域中消失。但是如果用户删除了一些文本,那么光标也可供用户再次输入。我该怎么做?

【问题讨论】:

    标签: jquery


    【解决方案1】:

    keyup 事件在默认行为(填充文本区域)发生后触发。

    最好使用keypress事件,过滤不可打印字符。

    演示:http://jsfiddle.net/3uhNP/1/(最大长度为 4)

    jQuery(document).ready(function($) {
        var max = 400;
        $('textarea.max').keypress(function(e) {
            if (e.which < 0x20) {
                // e.which < 0x20, then it's not a printable character
                // e.which === 0 - Not a character
                return;     // Do nothing
            }
            if (this.value.length == max) {
                e.preventDefault();
            } else if (this.value.length > max) {
                // Maximum exceeded
                this.value = this.value.substring(0, max);
            }
        });
    }); //end if ready(fn)
    

    【讨论】:

    • 谢谢,但在测试您的代码之后。一旦达到最大限制,它就会停止。我不能输入一个字。但是,如果然后我按退格键,那么它也不起作用。至少用户可以选择按退格键删除文本,然后再次开始输入。顺便说一句,这是我想要的行为。达到最大限制后,用户无法输入任何内容。 :) 用户按退格键删除然后再次开始输入文本,我该怎么做。谢谢
    • @Basit 更新了答案。在 Firefox 中,不可打印的字符没有被 jQuery 归一化为零。所以,你必须手动排除它(asciitable.com)。
    • 谢谢 Rob W:) 但请告诉我你使用了(e.which &lt; 0x20) 。这意味着所有不可打印的字符,如退格、回车、制表符、移位键。我说的对吗?你也说过nonprintable characters were not normalized to zero by jQuery。未归一化为 0 是什么意思?能给我解释一下吗?
    • @Basit 0x20 只是 32 的十六进制表示法。低于 32 的任何 ASCII 码都是不可打印的。 jQuery 的event.which 应该在所有浏览器中保持一致。它没有。在 Chrome 中,0 报告退格,在 Firefox 中报告 8。 event.which 代表 keypress 事件的 event.charCode 属性,它保存按下键的 ASCII 字符代码(如果不是字符则为零)。
    • 当用户输入字符时它会起作用。但是当用户复制并粘贴文本时它不起作用
    【解决方案2】:
    <textarea maxlength="400"> </textarea>
    

    使用上面的代码来限制插入文本区域的字符数,如果你想禁用文本区域本身(即之后将无法编辑)你可以使用javascript/jquery来禁用它。

    【讨论】:

    • 见鬼@RobW,请检查jsfiddle.net/ucb3n。编辑:在 Firefox 12.0、Chrome 18.0、IE9 上测试。无法在 IE9 上运行。
    • maxlength 属性是 HTML5 的新属性,不适用于 Internet Explorer 或 Firefox
    • @RobW ,感谢您提供的信息。老实说,我相信现在是我们都使用更新浏览器的时候了,当然“需要”它的人除外。
    • 请在 Firefox Chrome 和 Safari 中测试该解决方案 此解决方案在 Firefox 版本 51.0.1(64 位)中中断
    • 比公认的答案更好、更简单的解决方案。
    【解决方案3】:

    保持简单

    var max = 50;
    $("#textarea").keyup(function(e){
    $("#count").text("Characters left: " + (max - $(this).val().length));
    });
    

    并将其添加到您的 html 中

    <textarea id="textarea" maxlength="50"></textarea>
    <div id="count"></div>
    

    view example

    【讨论】:

    • 请在 Firefox Chrome 和 Safari 中测试该解决方案 此解决方案在 Firefox 版本 51.0.1(64 位)中中断
    【解决方案4】:

    只需在您的 Javascript 文件中编写此代码.. 但需要用 textarea 指定 'maxlength' 属性。 这适用于页面的所有文本区域。

    $('textarea').bind("change keyup input",function() {
    
            var limitNum=$(this).attr("maxlength");
    
            if ($(this).val().length > limitNum) {
                $(this).val($(this).val().substring(0, limitNum));
            }
    
        });
    

    【讨论】:

      【解决方案5】:

      您可以直接将maxlengthtextarea 以禁用自身。但是,您想显示适当的消息,然后使用 keyup 事件作为默认行为,使用 textarea length 计算字符并显示合适的消息。

      HTML

      <div id="count"></div>
      <textarea class="max"  maxlength="250" id="tarea"></textarea>
      <div id="msg"></div>
      

      jQuery

      $(function(){
          var max = parseInt($("#tarea").attr("maxlength"));
        $("#count").text("Characters left: " + max);
          $("#tarea").keyup(function(e){
              $("#count").text("Characters left: " + (max - $(this).val().length));
          if($(this).val().length==max)
              $("#msg").text("Limit Reached....");
              else
              $("#msg").text("");
          });
      });
      

      Demo Fiddle

      【讨论】:

        【解决方案6】:

        您可以保持活动原样,只需使用此 library

        示例

        // applying a click event to one element
        
        Touche(document.querySelector('#myButton')).on('click', handleClick);
        
        // or to multiple at once
        
        Touche(document.querySelectorAll('.myButtons')).on('click', handleClicks);
        
        // or with jQuery
        
        $('.myButtons').on('click', handleClicks);
        

        【讨论】:

          【解决方案7】:

          对于那些已经在浏览器中使用 ES2015 的人,这里是使用上面一些答案的实现:

          class InputCharacterCount {
            constructor(element, min, max) {
              this.element = element;
              this.min = min;
              this.max = max;
              this.appendCharacterCount();
            }
          
            appendCharacterCount(){
              let charCount = `<small class="char-counter help-block"></small>`;
              this.element.closest('.form-group').append(charCount);
            }
          
            count(event){
              this.element.attr('maxlength', this.max); // Add maxlenght attr to input element
          
              let value = this.element.val();
              this.element
                .closest('.form-group')
                .find('.char-counter')
                .html(value.length+'/'+this.max); // Add a character count on keyup/keypress
          
              if (value.length < this.min || value.length > this.max) { // color text on min/max changes
                this.element.addClass('text-danger');
              } else {
                this.element.removeClass('text-danger');
              }
            }
          }
          

          用法:

          let comment = $('[name="collection-state-comment"]');
          let counter = new InputCharacterCount(comment, 21, 140);
          $(comment).keyup(function(event){
            counter.count(event);
          });
          

          【讨论】:

            【解决方案8】:

            您可以使用this 插件而不是尝试编写自己的插件。我发现它工作得很好。

            【讨论】:

            • 以上链接失效,使用this oneinsted
            【解决方案9】:
             <script type="text/javascript">
                    $(document).ready(function () {
                        maxlength("TextArea1");
                    });
                    function maxlength(id) {
                        $('#' + id).on('input propertychange', function () {
                            CharLimit(this, 20);
                        });
                    }
            
                    function CharLimit(input, maxChar) {
                        var len = $(input).val().length;
                        if (len > maxChar) {
                            $(input).val($(input).val().substring(0, maxChar));
                        }
                    }
             </script>
            

            【讨论】:

            • 您好,欢迎来到 Stack Overflow!提示:发布答案时,最好解释一下为什么你的答案是一个好方法,以及如何它的工作原理。
            • 请说明您的代码以及它如何回答问题。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-05-04
            • 2022-10-19
            • 1970-01-01
            • 1970-01-01
            • 2011-05-09
            • 2012-07-28
            • 1970-01-01
            相关资源
            最近更新 更多