Đếm ký tự trong vùng văn bản


120

Tôi muốn đếm các ký tự trong một vùng văn bản, vì vậy tôi chỉ thực hiện:

<textarea id="field" onkeyup="countChar(this)"></textarea>

function countChar(val){
     var len = val.value.length;
     if (len >= 500) {
              val.value = val.value.substring(0, 500);
     } else {
              $('#charNum').text(500 - len);
     }
};

Có gì sai với đoạn mã của tôi? Nó không hoạt động! Chà, đó là chữ viết tay của người mới, cần giúp đỡ.


Trong tương lai, vui lòng chỉnh sửa câu hỏi của bạn hoặc sử dụng tính năng bình luận dưới câu trả lời để thêm thông tin bổ sung hoặc làm rõ. Câu trả lời phải là bài viết trực tiếp giải quyết vấn đề của bạn. Nếu bạn đăng một giải pháp cho vấn đề của riêng mình, hãy chấp nhận giải pháp của bạn là câu trả lời chính xác. Tôi đã xóa rất nhiều 'câu trả lời' của bạn, vì bạn đã chấp nhận một câu trả lời khác.
Tim Post

Câu trả lời:


169

Bạn thấy lỗi nào trong trình duyệt? Tôi có thể hiểu tại sao mã của bạn không hoạt động nếu những gì bạn đã đăng không đầy đủ, nhưng không biết rằng tôi không thể biết chắc chắn.

<!DOCTYPE html>
<html>
  <head>
    <script src="http://code.jquery.com/jquery-1.5.js"></script>
    <script>
      function countChar(val) {
        var len = val.value.length;
        if (len >= 500) {
          val.value = val.value.substring(0, 500);
        } else {
          $('#charNum').text(500 - len);
        }
      };
    </script>
  </head>

  <body>
    <textarea id="field" onkeyup="countChar(this)"></textarea>
    <div id="charNum"></div>
  </body>

</html>

... hoạt động tốt cho tôi.

Chỉnh sửa: Bạn có thể nên xóa div charNum hoặc viết một cái gì đó, nếu chúng vượt quá giới hạn.


1
có thật không? Tôi chỉ có một span thay vì div cho id = 'charNum', hãy để tôi xem lại!
Kyle

Sau khi xem mã hoàn chỉnh của bạn, bạn mong đợi nó sẽ làm gì khác đi? Điều gì là "hỏng" về nó?
Caterham

bạn có thể xóa "else", chỉ vì chúng ta đạt 500 không có nghĩa là chúng ta nên ngăn #charNum hiển thị giá trị, "else" sẽ làm cho con số dừng lại ở 1 thay vì 0 như hiện tại.
Joakim

@Joakim, tôi đã xóa cái khác nhưng, trong trường hợp này, tôi sẽ nhận được số âm!
Kyle

Có thể chỉ cần thêm một cái gì đó vào if, đặt charNum để nói "Bạn đã đạt đến giới hạn", hoặc một cái gì đó tương tự.
Caterham

83

Phiên bản cải tiến dựa trên chức năng của Caterham :

$('#field').keyup(function () {
  var max = 500;
  var len = $(this).val().length;
  if (len >= max) {
    $('#charNum').text(' you have reached the limit');
  } else {
    var char = max - len;
    $('#charNum').text(char + ' characters left');
  }
});

1
Đừng sử dụng cái này. Giải pháp này là thiếu sót như Etienne Martin đã chỉ ra.
Fabian Bigler

79

⚠️ Giải pháp được chấp nhận là thiếu sót.

Dưới đây là hai tình huống mà keyupsự kiện sẽ không bị kích hoạt:

  1. Người dùng kéo văn bản vào vùng văn bản.
  2. Người dùng sao chép-dán văn bản trong vùng văn bản bằng một cú nhấp chuột phải (menu ngữ cảnh).

Sử dụng inputsự kiện HTML5 để có giải pháp mạnh mẽ hơn:

<textarea maxlength='140'></textarea>

JavaScript ( demo ):

const textarea = document.querySelector("textarea");

textarea.addEventListener("input", event => {
    const target = event.currentTarget;
    const maxLength = target.getAttribute("maxlength");
    const currentLength = target.value.length;

    if (currentLength >= maxLength) {
        return console.log("You have reached the maximum number of characters.");
    }

    console.log(`${maxLength - currentLength} chars left`);
});

Và nếu bạn thực sự muốn sử dụng jQuery:

$('textarea').on("input", function(){
    var maxlength = $(this).attr("maxlength");
    var currentLength = $(this).val().length;

    if( currentLength >= maxlength ){
        console.log("You have reached the maximum number of characters.");
    }else{
        console.log(maxlength - currentLength + " chars left");
    }
});

4
Không biết về inputsự kiện này. Cảm ơn
Abk

Một câu hỏi nhanh (chưa thử mã / phương pháp của bạn) liệu điều này có hoạt động cho nhập liệu bằng giọng nói không?
Syfer

1
@Syfer Hoàn toàn đúng.
Etienne Martin

Tôi sẽ thử cái này. Tôi cần một cái gì đó như thế này cho một dự án nhỏ tại nơi làm việc.
Syfer

Đoạn mã trên không hoạt động trong iOS khi giọng nói được sử dụng cả JS và jQuery. Có suy nghĩ gì không?
Syfer

9

Mẫu HTML, được sử dụng ở bất cứ nơi nào tôi cần bộ đếm, hãy lưu ý mức độ liên quan của các ID của textarea và khoảng thứ hai: id="post"<-> id="rem_post"và tiêu đề của khoảng chứa số lượng ký tự mong muốn của mỗi văn bản cụ thể

<textarea class="countit" name="post" id="post"></textarea>
<p>
  <span>characters remaining: <span id="rem_post" title="1000"></span></span>
</p>

Hàm JavaScript, thường được đặt trước </body>trong tệp mẫu của tôi, yêu cầu jQuery

$(".countit").keyup(function () {
  var cmax = $("#rem_" + $(this).attr("id")).attr("title");

  if ($(this).val().length >= cmax) {
    $(this).val($(this).val().substr(0, cmax));
  }

  $("#rem_" + $(this).attr("id")).text(cmax - $(this).val().length);

});

9

điều này làm việc tốt cho tôi.

$('#customText').on('keyup', function(event) {
   var len = $(this).val().length;
   if (len >= 40) {
      $(this).val($(this).val().substring(0, len-1));
   }
});

7

substring()cần phải trở thành substr().

Ví dụ: jsfiddle.net/xqyWV


@MattCurtis: bạn nên đăng jsFiddle-demo của mình trong bài đăng gốc (để nhận được nhiều lượt ủng hộ hơn và) để làm cho nó dễ đánh dấu hơn. Tôi đã cố gắng chỉnh sửa bài đăng của bạn và dán liên kết, nhưng chỉnh sửa của tôi đã bị từ chối.
Sk8erPeter

Bạn có thể vui lòng đăng mẫu ĐẦY ĐỦ .. bao gồm phiên bản jquery mà bạn đã sử dụng. Mẫu trên là vô dụng. Lấy làm tiếc!.
deepcell

@ B4NZ41 Hoạt động tốt đối với tôi. Cũng có những câu trả lời khác cho điều này giải quyết nó tốt hơn.
mattsven

4

Chà, điều này không khác nhiều so với những gì đã nói, nhưng điều này hoạt động rất tốt trên tất cả các trình duyệt.

Ý tưởng là xóa bất kỳ văn bản nào vượt quá độ dài đã xác định.

function countTextAreaChar(txtarea, l){
    var len = $(txtarea).val().length;
    if (len > l) $(txtarea).val($(txtarea).val().slice(0, l));
    else $('#charNum').text(l - len);
    }

Mã HTMl sẽ là:

<div id="charNum"></div>
<textarea onkeyup="countTextAreaChar(this, 10)" class="textareaclass" id="smallword" rows="40" cols="30" name="smallword"></textarea>

4

HTML

<form method="post">
<textarea name="postes" id="textAreaPost" placeholder="Write what's you new" maxlength="500"></textarea>

<div id="char_namb" style="padding: 4px; float: right; font-size: 20px; font-family: Cocon; text-align: center;">500 : 0</div>
</form>

jQuery

$(function(){
    $('#textAreaPost').keyup(function(){
      var charsno = $(this).val().length;
      $('#char_namb').html("500 : " + charsno);
    });
});

3

Tôi đã làm một sự kết hợp của những điều trên. Nó cho phép tạm dừng nhập văn bản và cho phép khoảng cách lùi, đồng thời giữ số lượng, ngay cả khi khoảng cách lùi:

Mã JavaScript:

$(document).ready(function () {

  $('#giftmsg').keypress(function (event) {
    var max = 250;
    var len = $(this).val().length;

    if (event.which < 0x20) {
      // e.which < 0x20, then it's not a printable character
      // e.which === 0 - Not a character
      return; // Do nothing
    }

    if (len >= max) {
      event.preventDefault();
    }

  });

  $('#giftmsg').keyup(function (event) {
    var max = 250;
    var len = $(this).val().length;
    var char = max - len;

    $('#textleft').text(char + ' characters left');

  });

});

HTML:

<div class="col3">
    <h2>3. Optional gift message</h2>
    Enter gift message. Limit 250 characters.<br /><br />
    <textarea cols="36" rows="5" id="giftmsg" ></textarea>
    <a style="padding:7px 0 0 0" href="#">Save Message</a>
    <div id="textleft">250 characters left</div>
</div>

Tín dụng cho những áp phích trước tôi !! Hy vọng điều này sẽ giúp ai đó!


3

Tôi đã tạo plugin jQuery của riêng mình cho tác vụ này, bạn có thể thử nó tại đây:

http://jsfiddle.net/Sk8erPeter/8NF4r/

Bạn có thể tạo bộ đếm ký tự khi đang di chuyển (và cả bộ đếm ký tự còn lại), bạn có thể xác định xem bạn có muốn cắt văn bản hay không, bạn có thể xác định văn bản hậu tố và bạn cũng có thể xác định một định dạng ngắn và dấu phân tách của nó.

Đây là một ví dụ sử dụng:

$(document).ready(function () {

    $('#first_textfield').characterCounter();

    $('#second_textfield').characterCounter({
        maximumCharacters: 20,
        chopText: true
    });

    $('#third_textfield').characterCounter({
        maximumCharacters: 20,
        shortFormat: true,
        shortFormatSeparator: " / ",
        positionBefore: true,
        chopText: true
    });

    $('#fourth_textfield').characterCounter({
        maximumCharacters: 20,
        characterCounterNeeded: true,
        charactersRemainingNeeded: true,
        chopText: false
    });

    $('#first_textarea').characterCounter({
        maximumCharacters: 50,
        characterCounterNeeded: true,
        charactersRemainingNeeded: false,
        chopText: true
    });

    $('#second_textarea').characterCounter({
        maximumCharacters: 25
    });

});

Đây là mã của plugin:

/**
 * Character counter and limiter plugin for textfield and textarea form elements
 * @author Sk8erPeter
 */ 
(function ($) {
  $.fn.characterCounter = function (params) {
    // merge default and user parameters
    params = $.extend({
      // define maximum characters
      maximumCharacters: 1000,
      // create typed character counter DOM element on the fly
      characterCounterNeeded: true,
      // create remaining character counter DOM element on the fly
      charactersRemainingNeeded: true,
      // chop text to the maximum characters
      chopText: false,
      // place character counter before input or textarea element
      positionBefore: false,
      // class for limit excess
      limitExceededClass: "character-counter-limit-exceeded",
      // suffix text for typed characters
      charactersTypedSuffix: " characters typed",
      // suffix text for remaining characters
      charactersRemainingSuffixText: " characters left",
      // whether to use the short format (e.g. 123/1000)
      shortFormat: false,
      // separator for the short format
      shortFormatSeparator: "/"
    }, params);

    // traverse all nodes
    this.each(function () {
      var $this = $(this),
        $pluginElementsWrapper,
        $characterCounterSpan,
        $charactersRemainingSpan;

      // return if the given element is not a textfield or textarea
      if (!$this.is("input[type=text]") && !$this.is("textarea")) {
        return this;
      }

      // create main parent div
      if (params.characterCounterNeeded || params.charactersRemainingNeeded) {
        // create the character counter element wrapper
        $pluginElementsWrapper = $('<div>', {
          'class': 'character-counter-main-wrapper'
        });

        if (params.positionBefore) {
          $pluginElementsWrapper.insertBefore($this);
        } else {
          $pluginElementsWrapper.insertAfter($this);
        }
      }

      if (params.characterCounterNeeded) {
        $characterCounterSpan = $('<span>', {
          'class': 'counter character-counter',
          'text': 0
        });

        if (params.shortFormat) {
          $characterCounterSpan.appendTo($pluginElementsWrapper);

          var $shortFormatSeparatorSpan = $('<span>', {
            'html': params.shortFormatSeparator
          }).appendTo($pluginElementsWrapper);

        } else {
          // create the character counter element wrapper
          var $characterCounterWrapper = $('<div>', {
            'class': 'character-counter-wrapper',
            'html': params.charactersTypedSuffix
          });

          $characterCounterWrapper.prepend($characterCounterSpan);
          $characterCounterWrapper.appendTo($pluginElementsWrapper);
        }
      }

      if (params.charactersRemainingNeeded) {

        $charactersRemainingSpan = $('<span>', {
          'class': 'counter characters-remaining',
          'text': params.maximumCharacters
        });

        if (params.shortFormat) {
          $charactersRemainingSpan.appendTo($pluginElementsWrapper);
        } else {
          // create the character counter element wrapper
          var $charactersRemainingWrapper = $('<div>', {
            'class': 'characters-remaining-wrapper',
            'html': params.charactersRemainingSuffixText
          });
          $charactersRemainingWrapper.prepend($charactersRemainingSpan);
          $charactersRemainingWrapper.appendTo($pluginElementsWrapper);
        }
      }

      $this.keyup(function () {

        var typedText = $this.val();
        var textLength = typedText.length;
        var charactersRemaining = params.maximumCharacters - textLength;

        // chop the text to the desired length
        if (charactersRemaining < 0 && params.chopText) {
          $this.val(typedText.substr(0, params.maximumCharacters));
          charactersRemaining = 0;
          textLength = params.maximumCharacters;
        }

        if (params.characterCounterNeeded) {
          $characterCounterSpan.text(textLength);
        }

        if (params.charactersRemainingNeeded) {
          $charactersRemainingSpan.text(charactersRemaining);

          if (charactersRemaining <= 0) {
            if (!$charactersRemainingSpan.hasClass(params.limitExceededClass)) {
              $charactersRemainingSpan.addClass(params.limitExceededClass);
            }
          } else {
            $charactersRemainingSpan.removeClass(params.limitExceededClass);
          }
        }
      });

    });

    // allow jQuery chaining
    return this;

  };
})(jQuery);

Điều này không cập nhật bộ đếm khi tải ban đầu nếu đã có văn bản trong các phần tử. Một sửa chữa nhỏ mặc dù.
Ravendarksky

2
$.fn.extend( {
       limiter: function(limit, elem) {
            $(this).on("keyup focus", function() {
               setCount(this, elem);
           });
            function setCount(src, elem) {
               var chars = src.value.length;
                if (chars > limit) {
                    src.value = src.value.substr(0, limit);
                    chars = limit;
                }
                elem.html( limit - chars );
            }
            setCount($(this)[0], elem);
        }
    });

    var elem = $("#cntr");  
    $("#status_txt").limiter(160, elem);

2

Tôi đã tự hỏi làm thế nào để làm điều này tương tự và lấy ý tưởng từ mọi người ở đây, đây là những gì tôi đã nghĩ ra:

JsFiddle

<textarea name="message" rows="4" cols="24" maxlength="1000" id="message" placeholder="Message:" style=""></textarea><br/>
<span id="charNum"></span>

$('#message').keyup(function () {
  max = this.getAttribute("maxlength");
  var len = $(this).val().length;
   if (len >= max) {
    $('#charNum').text(' you have reached the limit');
   } else {
    var char = max - len;
    $('#charNum').text(char + ' characters left');
   }
});

1
$(document).ready(function() {
    var count = $("h1").text().length;
    alert(count);
});

Ngoài ra, bạn có thể đặt id phần tử hoặc lớp của riêng mình thay vì "h1" và độ dài sự kiện đếm các ký tự của chuỗi vùng văn bản ☻


0

Mã của bạn có một chút hỗn hợp. Đây là một phiên bản sạch:

<script type="text/javascript">
    $(document).ready(function() {
        $("#add").click(function() {
            $.post("SetAndGet.php", {
                know: $("#know").val()
            }, function(data) {
                $("#know_list").html(data);
            });
        });

        function countChar(val) {
            var len = val.value.length;
            if (len >= 500) {
                val.value = val.value.substring(0, 500);
            } else {
                $('#charNum').text(500 - len);
            }
        }
    });
</script>

Sly, hãy tin tôi, điều đó không làm việc, có vẻ như chức năng bắt đầu với .. function () {.. cần phải ra khỏi $ (document) .ready (function () {
Kyle

0

Hãy thử cái này.

<textarea maxlength="410" name="about_me" onkeydown="CountLeft(this.form.about_me, this.form.left);" onkeyup="CountLeft(this.form.about_me,this.form.left); "></textarea>

<input maxlength="3" name="left" readonly="" size="3" type="text" value="410" /> characters left

<script>
function CountLeft(field, count) 
{
    var max = "410";
    if (field.value.length > max)
    {
        field.value = field.value.substring(0, max);
    }
    else
    {
        count.value = max - field.value.length;
    }
}
</script>

0

Một phiên bản chung chung hơn để bạn có thể sử dụng hàm cho nhiều trường.

<script src="../site/jquery/jquery.min.js" ></script>
<script type="text/javascript">

function countChar(inobj, maxl, outobj) {
    var len = inobj.value.length;
    var msg = ' chr left';
    if (len >= maxl) {
        inobj.value = inobj.value.substring(0, maxl);
        $(outobj).text(0 + msg);
    } else {
        $(outobj).text(maxl - len + msg);
    }
}


$(document).ready(function(){

    //set up summary field character count
    countChar($('#summary').get(0),500, '#summarychrs'); //show inital value on page load
    $('#summary').keyup(function() {
        countChar(this, 500, '#summarychrs'); //set up on keyup event function
    });

});
</script>

<textarea name="summary" id="summary" cols="60" rows="3" ><?php echo $summary ?></textarea> 
<span id="summarychrs">0</span>

0
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>

    <script>

            function countChar(val) 
            {

             var limit = 1024;

            if ( val.length > limit )
              { 
              $("#comment").val(val.substring(0, limit-1));
              val.length = limit;
              }

              $("#count").html((limit)-(val.length));     
              }

        </script>

        <textarea id="comment" onKeyUp="countChar(this.value)" required></textarea>

        <div id="count"></div>

Sử dụng phần sau để bỏ qua việc sử dụng khác và cũng bỏ qua việc nhận số âm.


0

Đây là ví dụ của tôi. Bữa tối đơn giản

$(document).ready(function() {
      
        var textarea    = $("#my_textarea");
  
        textarea.keydown(function(event) {
          
            var numbOfchars = textarea.val();
            var len = numbOfchars.length;
            $(".chars-counter").text(len);

        });
  
  
 }); 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea id="my_textarea" class="uk-textarea" rows="5" name="text"></textarea>
<h1 class="chars-counter">0</h1>


0

Chúng tôi không hài lòng với bất kỳ giải pháp có chủ đích nào.

Vì vậy, chúng tôi đã tạo ra một giải pháp bộ đếm ký tự hoàn chỉnh cho JQuery, được xây dựng dựa trên jquery-jeditable . Đó là một textareatiện ích mở rộng plugin có thể tính theo cả hai cách, hiển thị thông báo tùy chỉnh, giới hạn số lượng ký tự và cũng hỗ trợ jquery-datatables .

Bạn có thể kiểm tra nó ngay lập tức trên JSFiddle .

Liên kết GitHub: https://github.com/HippotecLTD/realworld_jquery_jeditable_charcount

Bắt đầu nhanh

Thêm những dòng này vào HTML của bạn:

<script async src="https://cdn.jsdelivr.net/gh/HippotecLTD/realworld_jquery_jeditable_charcount@1.0.0/dist/jquery.jeditable.charcounter.realworld.min.js"></script>
<script async src="https://cdn.jsdelivr.net/gh/HippotecLTD/realworld_jquery_jeditable_charcount@1.0.0/dist/jquery.charcounter.realworld.min.js"></script>

Và sau đó:

$("#myTextArea4").charCounter();

-1
$('#field').keyup(function () {
    var max = 160;
    var len = $(this).val().length;
//  var char = max - len;
    var messages = Math.ceil(len / 160);
    if (len >= max) {
        $('#charNum').text('(' + messages + ') ' + len + '/' + max);
    } else {
        $('#charNum').text(len + '/' + max);
    }
    });

-1

Bạn có thể sử dụng:

    $(document).ready(function () {
  $('#ID').keyup(function () {
   var val = $(this).val();
   len = val.length;
   if (len >= 140) {
    $(this).text(val.substring(0, 140));
   } else {
    console.log(140 - len);
    $('#charNum').empty().append(140 - len);
   }
  });
 });
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.