質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

2回答

3990閲覧

textareaの行数・一行あたりの文字数制限による意図しない動作について

FMK

総合スコア6

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Internet Explorer

Internet Explorer(IE;MSIE)はマイクロソフトが開発したウェブブラウザです。Microsoft Windowsに組み込まれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/09/18 02:38

編集2020/09/18 02:46

こういった場での質問になれていない為不備があればすみません。

概要

textareaに付加している行数・一行あたりの文字数制限について、2点の意図しない動作があり修正できず困っています。
できればIE11でも意図通りに動くようにしたいですが、最悪Chromeなどのモダンブラウザのみでも動くようになって欲しいです。

処理内容

textareaに4行まで・一行あたり65文字まで入力可能な制限を掛ける

意図しない動作①

何行か入力したあと、途中の行で改行をしても末尾の改行になってしまう

意図しない動作②

半角モード時に改行をすると、4行未満でも改行が削除されてしまう

ソース、デモ

Codepen

html

1<textarea id="area" rows="4" cols="65"></textarea>

javascript

1(function() { 2 'use strict'; 3 const sliceText = function(e) { 4 let lines=this.textarea.value.split("\n"); 5 // 各行を指定した文字数に切り捨てる 6 for(let i=0; i<lines.length; i++){ 7 if(lines[i].length >this.len){ 8 lines[i]=lines[i].substr(0,this.len); 9 } 10 } 11 this.textarea.value = ""; 12 // 指定された行数までに切り捨てる 13 for(let j=0; j<this.row; j++){ 14 if(lines[j]){ 15 if(j > 0 && j < this.row) this.textarea.value+="\n"; 16 this.textarea.value+=lines[j]; 17 } 18 } 19 } 20 const textArea = document.querySelector('textarea[id*="area"]'); 21 const obj = {textarea: textArea, len: 65, row: 4, handleEvent: sliceText}; 22 textArea.addEventListener("keypress", obj); 23 textArea.addEventListener("focusout", obj); 24})();

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

そもそも論ですが、その制限は入力中にやらなければいけないのでしょうか。

入力している途中で文字列に変更をかけると、「変換途中の入力が確定しまう」などの不安定な挙動を示す例があったり、「入力したけど即座に削られるために入力が適用されない」など、ユーザーから見た操作性が悪くて混乱を招くことも考えられます。

すでにfocusoutでイベントを仕掛けていますが、そちらのタイミングだけでもいいかもしれません。

(「入力中にも制限する動作」自体が必要なら、この回答は無視してください)

投稿2020/09/18 02:47

maisumakun

総合スコア145208

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

FMK

2020/09/18 03:02

まったくもって仰る通りなのですが、先方からの要望もあり上記のような制限になっています。 ただ、不安定な動作がどうしても解消できない場合は別の方法による制限の交渉も考えています。 ひとまずは要望通りの動作で動くことができないか検証したく、質問させて頂きました。
maisumakun

2020/09/18 03:16

入力中に変更を行う場合、文字列を生成してから、selectionStartやselectionEndを使ってカーソル位置も制御する必要があるかと思います。
guest

0

MDN HTMLTextAreaElement
「例」セクション「HTML タグを挿入する例」や「長さと行数の制限の例」は参考になるかもしれません。

  • selectionStart
  • selectionEnd
  • selectionDirection

「65文字」ということですが、 Unicode の文字には HalfWidth(半角文字)、FullWidth(全角文字) の2種類があるので、見栄え上のcols="65" が HalfWidth 基準になることを考慮する必要もありそうです。

また、for ループで走査されていますが、キー入力に反応するイベントの場合、String オブジェクトのメソッドでポインタ計算するなど、数値演算できるものはそうしたほうが良いのではないでしょうか。

CODEPEN(不完全です)

最後に、PCブラウザだけでなくスマホやタブレットでの挙動も実機で確認する必要があると思います
(ソフトウェアキーボードがイベントに対応していて、正しく補足できるかなどの確認)

投稿2020/09/18 15:02

AkitoshiManabe

総合スコア5434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問