นับอักขระใน textarea


120

ฉันต้องการนับอักขระในพื้นที่ข้อความดังนั้นฉันจึงสร้าง:

<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);
     }
};

รหัสชิ้นส่วนของฉันมีอะไรผิดปกติ มันไม่ทำงาน! นั่นเป็นลายมือมือใหม่ต้องการความช่วยเหลือ


ในอนาคตโปรดแก้ไขคำถามของคุณหรือใช้คุณลักษณะความคิดเห็นใต้คำตอบเพื่อเพิ่มข้อมูลเพิ่มเติมหรือคำชี้แจง คำตอบควรเป็นโพสต์ที่ช่วยแก้ปัญหาของคุณโดยตรง หากคุณโพสต์วิธีแก้ปัญหาของคุณเองให้ยอมรับวิธีแก้ปัญหาของคุณเป็นคำตอบที่ถูกต้อง ฉันได้ลบ 'คำตอบ' ของคุณจำนวนมากเนื่องจากคุณได้ยอมรับคำตอบอื่น
Tim Post

คำตอบ:


169

คุณพบข้อผิดพลาดอะไรในเบราว์เซอร์ ฉันเข้าใจได้ว่าทำไมโค้ดของคุณถึงใช้งานไม่ได้หากสิ่งที่คุณโพสต์ไม่สมบูรณ์ แต่ไม่รู้ว่าฉันไม่สามารถรู้ได้แน่นอน

<!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>

... ทำงานได้ดีสำหรับฉัน

แก้ไข: คุณควรล้าง charNum div หรือเขียนบางสิ่งบางอย่างหากเกินขีด จำกัด


1
จริงๆ? ฉันมีแค่ช่วงหนึ่งแทนที่จะเป็น div สำหรับ id = 'charNum' ให้ฉันดูอีกครั้ง!
Kyle

หลังจากเห็นโค้ดที่สมบูรณ์แล้วคุณคาดหวังให้โค้ดทำอะไรแตกต่างออกไป "เสีย" เกี่ยวกับอะไร?
Caterham

คุณสามารถลบ "else" ออกได้เพียงเพราะเราตี 500 ไม่ได้หมายความว่าเราควรป้องกันไม่ให้ #charNum แสดงค่าส่วน "else" จะทำให้ตัวเลขหยุดที่ 1 แทนที่จะเป็น 0 เหมือนตอนนี้
Joakim

@ Joakim ฉันลบสิ่งอื่นออกไป แต่ในกรณีนี้ฉันจะได้รับจำนวนลบ!
Kyle

อาจจะเพิ่มบางอย่างใน if การตั้งค่า charNum ให้พูดว่า "คุณถึงขีด จำกัด แล้ว" หรืออะไรทำนองนั้น
Caterham

83

เวอร์ชันปรับปรุงตามฟังก์ชันของ 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
อย่าใช้สิ่งนี้ โซลูชันนี้มีข้อบกพร่องตามที่ Etienne Martin ชี้ไว้
Fabian Bigler

79

⚠️ทางออกที่ยอมรับมีข้อบกพร่อง

ต่อไปนี้เป็นสองสถานการณ์ที่keyupเหตุการณ์จะไม่เริ่ม:

  1. ผู้ใช้ลากข้อความลงในพื้นที่ข้อความ
  2. ผู้ใช้คัดลอกและวางข้อความในพื้นที่ข้อความด้วยการคลิกขวา (เมนูตามบริบท)

ใช้inputเหตุการณ์HTML5 แทนสำหรับโซลูชันที่มีประสิทธิภาพมากขึ้น:

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

JavaScript ( สาธิต ):

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`);
});

และหากคุณต้องการใช้ 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
ไม่ทราบinputเหตุการณ์ ขอบคุณ
Abk

คำถามสั้น ๆ (ยังไม่ได้ลองใช้รหัส / วิธีการ) จะใช้ได้กับการป้อนข้อมูลด้วยเสียงหรือไม่?
Syfer

ฉันจะลองสิ่งนี้ ฉันต้องการสิ่งนี้สำหรับโครงการเล็ก ๆ ในที่ทำงาน
Syfer

โค้ดด้านบนใช้ไม่ได้ใน iOS เมื่อใช้เสียงทั้ง JS และ jQuery ความคิดใด ๆ ?
Syfer

@Syfer คุณสามารถสำรอง setInterval ที่ตรวจสอบจำนวนอักขระบน iOS ได้ตลอดเวลา
Etienne Martin

9

ตัวอย่าง HTML ใช้ทุกที่ที่ฉันต้องการตัวนับสังเกตความเกี่ยวข้องของ ID ของพื้นที่ข้อความและช่วงที่สอง: id="post"<-> id="rem_post"และชื่อของช่วงที่เก็บจำนวนอักขระที่ต้องการของแต่ละพื้นที่ข้อความ

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

ฟังก์ชัน JavaScript มักจะวางไว้ก่อนหน้า</body>ในไฟล์เทมเพลตของฉันต้องใช้ 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

สิ่งนี้ใช้ได้ดีสำหรับฉัน

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

7

substring()substr()ความต้องการที่จะกลายเป็น

ตัวอย่าง: jsfiddle.net/xqyWV


@MattCurtis: คุณควรโพสต์ jsFiddle-demo ของคุณในโพสต์ต้นฉบับ (เพื่อรับคะแนนโหวตมากขึ้นและ) เพื่อให้สามารถทำเครื่องหมายได้มากขึ้น ฉันพยายามแก้ไขโพสต์ของคุณและวางลิงก์ แต่การแก้ไขของฉันถูกปฏิเสธ
Sk8erPeter

คุณช่วยโพสต์ตัวอย่างเต็มได้ไหม .. รวมถึงเวอร์ชัน jquery ที่คุณเคยใช้ ตัวอย่างข้างต้นไม่มีประโยชน์ ขออภัย !.
deepcell

@ B4NZ41 ใช้ได้ดีสำหรับฉัน นอกจากนี้ยังมีคำตอบอื่น ๆ สำหรับสิ่งนี้ที่ตอบโจทย์ได้ดีกว่า
mattsven

4

นี่ไม่ได้แตกต่างจากที่พูดไป แต่มันใช้ได้ดีในทุกเบราว์เซอร์

แนวคิดคือการลบข้อความใด ๆ ที่เกินความยาวที่กำหนดไว้

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

รหัส HTMl จะเป็น:

<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

ฉันทำรวมกันข้างต้น ช่วยให้สามารถหยุดการป้อนข้อความและช่วยให้สามารถเว้นวรรคได้อีกทั้งยังคงนับแม้ในขณะที่เว้นวรรค:

รหัส 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>

เครดิตผู้โพสต์ก่อนฉัน !! หวังว่านี่จะช่วยใครสักคน!


3

ฉันสร้างปลั๊กอิน jQuery ของตัวเองสำหรับงานนี้คุณสามารถลองใช้งานได้ที่นี่:

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

คุณสามารถสร้างตัวนับอักขระได้ทันที (และตัวนับอักขระที่เหลืออยู่) คุณสามารถกำหนดได้ว่าต้องการตัดข้อความหรือไม่คุณสามารถกำหนดข้อความต่อท้ายและคุณยังสามารถกำหนดรูปแบบสั้น ๆ และตัวคั่นได้อีกด้วย

นี่คือตัวอย่างการใช้งาน:

$(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
    });

});

นี่คือรหัสของปลั๊กอิน:

/**
 * 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);

สิ่งนี้จะไม่อัปเดตตัวนับเมื่อโหลดครั้งแรกหากมีข้อความอยู่ในองค์ประกอบแล้ว แม้ว่าการแก้ไขเล็กน้อย
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

ฉันสงสัยว่าจะทำสิ่งเดียวกันนี้ได้อย่างไรและได้รับแนวคิดจากทุกคนที่นี่นี่คือสิ่งที่ฉันคิดขึ้น:

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);
});

นอกจากนี้คุณสามารถใส่รหัสองค์ประกอบหรือคลาสของคุณเองแทน "h1" และเหตุการณ์ความยาวนับอักขระของสตริงพื้นที่ข้อความของคุณ☻


0

รหัสของคุณปนกันเล็กน้อย นี่คือเวอร์ชันที่สะอาด:

<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>

เชื่อฉันเถอะว่ามันใช้ไม่ได้ดูเหมือนว่าฟังก์ชันที่ขึ้นต้นด้วย .. function () {.. จำเป็นต้องหมด $ (document) พร้อม (function () {
Kyle

0

ลองอันนี้.

<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

เวอร์ชันทั่วไปมากขึ้นเพื่อให้คุณสามารถใช้ฟังก์ชันได้มากกว่าหนึ่งฟิลด์

<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>

ใช้สิ่งต่อไปนี้เพื่อข้ามไปใช้อื่นและข้ามการนับติดลบ


0

นี่คือตัวอย่างของฉัน อาหารมื้อเย็นง่ายๆ

$(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

เราไม่พอใจกับแนวทางแก้ไขปัญหาใด ๆ

ดังนั้นเราจึงได้สร้างวิธีการแก้ปัญหาถ่านเคาน์เตอร์ที่สมบูรณ์แบบสำหรับ JQuery, สร้างขึ้นบนjQuery-jeditable เป็นtextareaส่วนขยายปลั๊กอินที่สามารถนับได้ทั้งสองวิธีแสดงข้อความที่กำหนดเอง จำกัด จำนวนถ่านและยังรองรับjquery-datatables jQuery-datatables

คุณสามารถทดสอบได้ทันทีบนJSFiddle JSFiddle

ลิงก์ GitHub: https://github.com/HippotecLTD/realworld_jquery_jeditable_charcount

เริ่มต้นอย่างรวดเร็ว

เพิ่มบรรทัดเหล่านี้ใน HTML ของคุณ:

<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>

แล้ว:

$("#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

คุณสามารถใช้:

    $(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);
   }
  });
 });
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.