文字数カウント [jQuery] [js]

2016/09に公開

入力フォームの文字入力において文字数制限をすることがあると思いますが、10文字程度ならともかく、それ以上になってくるとユーザーもいちいち何文字入力したか把握できません。
さらにある程度の文章を入力するとなると、制限を超えてしまったりして何度も入力しなおしが発生する分、ユーザーもストレスになってきます。

そこで、リアルタイムで文字数をカウントする仕組みを作ってみたいと思います。

通常は開発担当が実装してくれると思いますが、jsなどがある程度わかるのであれば難しくもないので、覚えておいて損はないでしょう。

ここではJqueryを用いますが、純粋にjsで実現することも可能です(ページ下の参考ページを参照するか、Google先生に聞いてください)。


sample

0/100文字

0/100文字

0/1000文字

0/1000文字

全角でも半角でも1文字は1文字文字としてカウントします。スペースや改行も1文字としてカウントされます。
なお、最大文字数を超えるとカウントは赤の太字に変化します。

IE7/8でも動作します(IE6では確認できていません)。


html

<input type="text" name="text" id="text">
<p><span class="count">0</span>/100文字</p>
<textarea name="textarea" id="textarea"></textarea>
<p><span class="count">0</span>/1000文字</p>

※黒い部分をダブルクリックするとソースを選択できるので、コピーして使ってください。

通常通り入力フォームを組んでください。必要であれば、適切なclass名やid名をつけてください。またCSSも適宜設定してください。


js

$(function(){
    var textboxM = 100; //テキストボックスの最大文字数(適宜変更)
    var textareaM = 1000; //テキストエリアの最大文字数(適宜変更)
    var rest = 0; //残文字数を格納するための変数
    $('textarea, input[type="text"]').on('keydown keyup keypress change',function(){
        var thisValueLength = $(this).val().length; //文字数を取得

        $(this).next('p').children('.count').html(thisValueLength); //文字数を出力

        if($(this).get(0).tagName.toLowerCase() == 'textarea') rest = textareaM - thisValueLength;
        else rest = textboxM - thisValueLength;

        if(rest < 0){
            $(this).next('p').children('.count').css({color:'#f00',fontWeight:'bold'});
        } else {
            $(this).next('p').children('.count').css({color:'#666',fontWeight:'normal'});
        }
    });
});

※黒い部分をダブルクリックするとソースを選択できるので、コピーして使ってください。

  1. 2〜4行目:テキストボックスやテキストエリアの最大文字数を変数に入れ、残り文字数を格納する変数を用意。
  2. 5行目〜:on()を使って指定したイベントが発生するごとに処理を行う。ここではテキストエリアとテキストボックスに対してkeydown、keyup、keypress、changeのイベントが発生した時、以下の処理を行う。
  3. 6行目:イベントが発生したテキストエリアまたはテキストボックスの文字数を取得し、変数thisValueLengthに格納
  4. 8行目:イベントが発生したテキストエリアまたはテキストボックスのすぐ次にあるpタグの子要素でclass[count]が指定してあるタグにthisValueLengthの値を与える
  5. 10〜11行目:イベントが発生したのがtextareaかどうかを判定して、textareaならば変数textareaMの値を、それ以外であれば変数textboxMを使って残りの文字数を計算し、変数restに格納
  6. 13〜17行目:残り文字数が0より小さくなったかどうか判定して、文字数カウントのcssを変更。
  • このサンプルでは同一ページに複数のテキストボックスやテキストエリアが存在し、最大文字数はすべてのテキストボックスでそれぞれ100字、すべてのテキストエリアでそれぞれ1000字と想定しています。テキストボックスごとやテキストエリアごとに最大文字数が違う場合は、それぞれにclass名やid名を付けるなどして、適宜jqueryコードを改造してください。
  • 10〜11行目の判定でtagNameプロパティで要素名を取得するとHTMLでは大文字で要素名を返すはずですが、そうならない場合もあるようなので、念のため小文字に変換しています。

戻る

Top