前人未踏の領域へ アプリ開発編

Android, iOSアプリ開発に関する調査メモ置き場。はてなダイアリーから移行したため古い記事にはアプリ以外も含まれます。

Inputタグの残り文字数を表示する

要件

  • テキストのmaxlengthに対して入力可能な残り文字数を表示する。
  • フォーカスのある時だけ表示される。
  • どのInputタグでも同じルールで書いておけば文字数が適用される。

HTML

  • p.counter = カウンター全体
  • span.count = 文字数出力
<div class="form-group">
    <p class="counter pull-right text-muted" style="display: none">あと<span class="count"></span>文字まで</p>
    <input class="form-control" name="title" id="title"
       rows="3" placeholder="タイトルを入力して下さい。" maxlength="50"/>
</div>
<div class="form-group">
    <p class="counter pull-right text-muted" style="display: none">あと<span class="count"></span>文字まで</p>
    <textarea class="form-control" name="comment" id="comment"
       rows="3" placeholder="コメントを入力して下さい。" maxlength="200"></textarea>
</div>

JavaScript

残り文字数の表示
  • input[type=text]タグとtextareaを探す
  • changeイベント,keyupイベントを取得する
  • 親要素以下のグループにカウンターがあるかを探す
  • あればmaxlengthを取得し、残りを得る。
  • span.counterに残数をセット
//変更があったら残り文字数を表示
$(document).on("change keyup", ".form-group input[type='text'],.form-group textarea", function () {
    var count, $parent, maxLength, $target;

    $parent = $(this).parent();
    $target = $("p.counter", $parent);
    if ($target.length == 1) {
        count = $(this).val().length;
        maxLength = $(this).attr('maxlength');
        if (isFinite(maxLength)) {
            $("span.count", $target).text(parseInt(maxLength) - count);
        }
        console.log(count);
    }
});
//フォーカスが当たったら表示
$(document).on("focus", ".form-group input[type='text'],.form-group textarea", function () {
    var count, $parent, maxLength, $target;
    $parent = $(this).parent();
    $target = $("p.counter", $parent);
    if ($target.length == 1) {
        count = $(this).val().length;
        maxLength = $(this).attr('maxlength');
        if (isFinite(maxLength)) {
            $("span.count", $target).text(parseInt(maxLength) - count);
        }
    }
    $target.show();
});
//フォーカスが外れたら隠す
$(document).on("blur", ".form-group input[type='text'],.form-group textarea", function () {
    var $parent, $target;
    $parent = $(this).parent();
    $target = $("p.counter", $parent);
    $target.hide();
});

リファクタリングの余地を残しつつ終了。Inputタグが増えてもJavaScript側の記述は増えないようにはなった。
残り文字数のブロック要素はあらかじめHTML側に書いておかずにJavaScript側で挿入でもよいかもしれない。その場合の方がinputタグ側のclass名か独自data属性の指定で機能を付与できてコード量が減りそう。