Metin alanındaki karakterleri sayın


120

Bir metin alanındaki karakterleri saymak istiyorum, bu yüzden az önce şunu yaptım:

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

Kod parçamın nesi var? İşe yaramıyor! Bu acemi bir el yazısıydı, yardıma ihtiyacım var.


Gelecekte, ek bilgi veya açıklama eklemek için lütfen sorunuzu düzenleyin veya yanıtların altındaki yorum özelliğini kullanın. Cevaplar, probleminizi doğrudan çözen gönderiler olmalıdır. Kendi probleminize bir çözüm gönderirseniz, çözümünüzü doğru cevap olarak kabul edin. Bir başkasını kabul ettiğiniz gibi, birçok 'cevabınızı' kaldırdım.
Tim Post

Yanıtlar:


169

Tarayıcıda hangi hataları görüyorsunuz? Gönderdiğiniz eksikse kodunuzun neden çalışmadığını anlayabiliyorum, ancak emin olamayacağımı bilmeden.

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

... benim için iyi çalışıyor.

Düzenleme: Muhtemelen charNum div'i temizlemelisiniz veya sınırı aşmışlarsa bir şeyler yazmalısınız.


1
Gerçekten mi? İd = 'charNum' için div yerine sadece bir span var, tekrar göreyim!
Kyle

Kodunuzun tamamını gördükten sonra, neyi farklı yapmasını bekliyordunuz? Bununla ilgili "bozuk" nedir?
Caterham

"else" i kaldırabilirsiniz, 500'e ulaşmamız, #charNum'un değeri görüntülemesini engellememiz gerektiği anlamına gelmez, "else" sayıyı şu anda olduğu gibi 0 yerine 1'de durduracaktır.
Joakim

@ Joakim, diğerini kaldırdım ama bu durumda negatif sayılar alacağım!
Kyle

Belki sadece if'e bir şey ekleyin, charNum'u "Sınıra ulaştınız" diyecek şekilde ayarlayabilir veya buna benzer bir şey yapabilirsiniz.
Caterham

83

Caterham'ın işlevine dayalı geliştirilmiş sürüm :

$('#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
Bunu kullanma. Bu çözüm, Etienne Martin'in işaret ettiği gibi kusurludur.
Fabian Bigler

79

⚠️ Kabul edilen çözüm kusurludur.

İşte keyupolayın ateşlenmeyeceği iki senaryo :

  1. Kullanıcı metni metin alanına sürükler.
  2. Kullanıcı, metin alanında bir sağ tıklama (bağlamsal menü) ile metni kopyalayıp yapıştırır.

inputDaha sağlam bir çözüm için bunun yerine HTML5 etkinliğini kullanı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`);
});

Ve kesinlikle jQuery kullanmak istiyorsanız:

$('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
inputOlayı bilmiyordum . Teşekkürler
Abk

Hızlı bir soru (henüz kodunuzu / yönteminizi denemediniz) bu ses girişi için işe yarayacak mı?
Syfer

Bunu deneyeceğim. İşte küçük bir proje için böyle bir şeye ihtiyacım vardı.
Syfer

Ses hem JS hem de jQuery kullanıldığında yukarıdaki kod iOS'ta çalışmadı. Düşüncesi olan var mı?
Syfer

@Syfer iOS'ta karakter sayısını periyodik olarak kontrol eden bir setInterval'e her zaman geri dönebilirsiniz.
Etienne Martin

9

Sayaca ihtiyaç duyduğum her yerde kullanılan HTML örneği, metin alanı ve ikinci aralığın kimliklerinin alaka düzeyine dikkat edin: id="post"<-> id="rem_post"ve her bir metin alanının istenen karakter miktarını tutan aralığın başlığı

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

Genellikle </body>şablon dosyamın önüne yerleştirilen JavaScript işlevi, jQuery gerektirir

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

bu benim için iyi çalıştı.

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

7

substring()olması gerekiyor substr().

Örnek: jsfiddle.net/xqyWV


@MattCurtis: jsFiddle-demo'nuzu orijinal gönderiye (daha fazla oy almak ve) daha işaretlenebilir hale getirmek için göndermeyi tercih etmelisiniz. Gönderinizi düzenlemeyi ve bağlantıyı yapıştırmayı denedim, ancak düzenlemem reddedildi.
Sk8erPeter

Tam örneği gönderebilir misiniz? Kullandığınız jquery sürümünü ekleyin. Yukarıdaki örnek işe yaramaz. Afedersiniz!.
deepcell

@ B4NZ41 Benim için iyi çalışıyor. Buna daha iyi hitap eden başka cevaplar da var.
mattsven

4

Bu söylenenden çok da farklı değil ama bu tüm tarayıcılarda çok iyi çalışıyor.

Fikir, tanımlanan uzunluğu aşan herhangi bir metni silmektir.

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 kodu şöyle olacaktır:

<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

Yukarıdakilerin bir kombinasyonunu yaptım. Metin girişinin durdurulmasına izin verir ve geri boşluğa izin verir, ayrıca geri boşluk bırakıldığında bile sayımı tutar:

JavaScript kodu:

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

Benden önce o posterlere kredi verin! Umarım bu birine yardımcı olur!


3

Bu görev için kendi jQuery eklentimi oluşturdum, buradan deneyebilirsiniz:

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

Hareket halindeyken karakter sayaçları (ve ayrıca kalan karakter sayaçlarını) oluşturabilir, metni kesmek isteyip istemediğinizi tanımlayabilir, son ek metinlerini tanımlayabilir ve ayrıca kısa bir format ve onun ayırıcısını tanımlayabilirsiniz.

İşte örnek bir kullanım:

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

});

İşte eklentinin kodu:

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

Öğelerde zaten metin varsa, bu, sayaçları ilk yüklemede güncellemez. Yine de önemsiz bir düzeltme.
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

Aynı şeyi nasıl yapacağımı merak ediyordum ve buradaki herkesten fikir alıyordum, bulduğum şey buydu:

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

Ayrıca, "h1" yerine kendi öğe kimliğinizi veya sınıfınızı koyabilirsiniz ve uzunluk olayı, metin alanı dizesindeki karakterlerinizi sayın ☻


0

Kodunuz biraz karışıktı. İşte temiz bir versiyon:

<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, inan bana, bu işe yaramıyor, öyle görünüyor ki .. function () {.. ile başlayan işlev $ (document) .ready (function () {
Kyle

0

Bunu dene.

<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

Fonksiyonu birden fazla alan için kullanabilmeniz için daha genel bir sürüm.

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

Başkasını atlamak ve ayrıca eksi sayımı atlamak için aşağıdakileri kullanın.


0

İşte benim örneğim. Basit akşam yemeği

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

Amaçlanan çözümlerin hiçbirinden memnun değildik.

Bu nedenle, JQuery için jquery-jeditable üzerine inşa edilmiş eksiksiz bir karakter sayacı çözümü oluşturduk . Her textareaiki yönde de sayabilen, özel bir mesaj görüntüleyen, karakter sayısını sınırlayan ve ayrıca jquery-datatables'ı destekleyen bir eklenti uzantısıdır. .

Hemen JSFiddle üzerinde test edebilirsiniz .

GitHub bağlantısı: https://github.com/HippotecLTD/realworld_jquery_jeditable_charcount

Hızlı başlangıç

Bu satırları HTML'nize ekleyin:

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

Ve sonra:

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

U kullanabilirsiniz:

    $(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);
   }
  });
 });
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.