[jQuery]テキストエリアに文字数制限をカウントダウン形式で制御する

テキストエリアに入力制限をかける。

・サンプルコード

テキストエリア入力時に20文字を超えると入力文字が反映されないようにする。
改行は1文字としてカウントする。
<!DOCTYPE html>
<html lang="ja">
	<head>
		<meta charset="utf-8">
		<title>テキストエリア文字数制限</title>
		<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.4.1.min.js"></script>
	</head>
	<body>
		<p>残り「<span id="limitlbl">0</span>」文字入力可能</p>
		<textarea id="memo" limit="20" cols="30" rows="10" style="overflow:auto" wrap="off"></textarea>
	</body>

	<script language="JavaScript" type="text/JavaScript">
	$(function(){

		// テキストエリアの制限数を設定する
		limit = $('#memo').attr("limit");
		$('#limitlbl').text(limit);

		/**
		 * 文字数制限
		 **/
		$("[limit]").off(".inputcontrol.limit").on("keyup.inputcontrol.limit", function(){
			var limit = $(this).attr("limit");  // 制限文字数を取得
			var currentval = $(this).val();     // 入力された文字列を取得
			var remaining = limit - currentval.length;  // 残りの入力文字数を取得

			$('#limitlbl').text(remaining);  // HTMLに残り文字数を設定

			// 制限文字数を超えると入力が反映されないようにする
			if (currentval.length >= limit) {
				$(this).val(currentval.substr(0,limit));
			}
		});
	});
	</script>
</html>

・実行結果

規定の文字数の入力があると入力文字が追加されないようになる。
改行も1文字として扱っているがあまり細かく制御しても
結局サーバーサイド側でチェックするので割愛。

その他、入力時に日本語の場合確定せずにキーを連打すると
残り文字数がおかしな挙動をする。
気になる場合は残り文字数がマイナスになった場合はテキストに
「これ以上入力できません」など代替えテキストに差し替える処理をいれるといい。

ほんとは各行に対して1行20文字までのような制限をかけたかったが
コピペで挙動がおかしくなったり半角と全角の混在、キーイベント諸々
見るのに時間がなくなった。

いろいろチェックしだすとキリがなかったのでサーバーサイドでチェックした方がいい。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です