• 締切済み

javaScript textareaの一行あたりの入力文字数制限につ

javaScript textareaの一行あたりの入力文字数制限について 1行あたり5文字しか入力できないtextareaを作成中です。 http://okwave.jp/qa/q1311128.html をアレンジして、自分で以下にように作ってみました。 これだと、最終行が5文字以上の場合は折り返して次以降の行に表示されるのですが、 最終行以外の途中の行に文字列を足すと、その分は、折り返して表示されません。(なくなってしまう)。 また、最終行にカーソルで移動して文字列を追加をすることはできますが、空白行(何も入力しない行)を入れることができません。 使い勝手は普通のテキストエリアと同じで、5文字入力すると自動的に改行するようなものを目指しているのですが、自分であーでもない、こーでもないといろいろやってみてもなかなかうまく行きません。。 なんとか、皆様のお知恵を拝借できないでしょうか。 なお、ブラウザはIEのみに対応でOKです。 よろしくお願いします。 ******************************************* 呼び出し元 ******************************************* (略) <tr> <td class="itemLabelBtm"> フリー入力欄 </td> <td class="display" colspan=""> <textarea cols="85" rows="4" name="memo" onkeypress="lineCheck();" style="overflow:auto" wrap="OFF"></textarea> <br> &nbsp;<font color="red">※1行には44文字まで入力できます。</font> </td> </tr> (略) ******************************************* スクリプト部分 ******************************************* function lineCheck(e){ var ta=document.getElementById("memo"); //一行に入力できる文字数 var col=5; //最後の改行をトリムする。 ta.value = ta.value.replace(/[\r\n]+$/,"") var lines=trim(ta.value).split("\r\n"); for(var i=0;i<lines.length;i++){ if(lines[i].length >col){ var temp = lines[i]; var tempLength = lines[i].length; lines[i]=lines[i].substr(0,col);//各行を指定した文字数に切り捨てる //最後の一行だけは、余った分を次の行に振り替える。 if(i==lines.length-1){ //何回振替を行えばよいか、計算する。 var furikaeNum = Math.ceil((tempLength - col)/col); var j; for(j = 1;j <= furikaeNum; j++){ lines[i + j] = temp.substring(col*j,col*(j+1)); } break; } } } ta.value=lines.join("\r\n"); } /*=================================================== 文字列両端の空文字トリミング ===================================================*/ function trim(str){ return str.replace(/^[  ]+/,"").replace(/[  ]+$/,""); }

みんなの回答

  • l27074
  • ベストアンサー率100% (5/5)
回答No.1

難しいですね。 キャレット位置の保存等必要なんでしょうね。 途中で挫折しました。 が、以下、何かの参考になれば。 呼出をonkeyupに変更してます。 onkeypressだと入力した文字がvalueに入る前に呼ばれてる?っぽいので。(IE9だからかも) <script> var before; function lineCheck(ta) { var text = ta.value; if (before == text) { return; } before = text; var col = 5; var lines = text.split('\r\n'); var result = new Array(); for (var i = 0, m = lines.length; i < m; i++) { if (lines[i].length == 0) { result.push(''); } else { for (var j = 0, n = lines[i].length; j * col < n; j++) { result.push(lines[i].substr(j * col, col)); } } } ta.value = result.join('\r\n'); } </script> <textarea cols="85" rows="4" name="memo" onkeyup="lineCheck(this)" style="overflow:auto" wrap="OFF"></textarea>

jamajamabo
質問者

お礼

ご回答ありがとうございます(泣)。 キャレット位置ですか。 うーん、けっこう複雑になりそうですね。 でもヒントになりました! コードも載せていただいてありがとうございます。 日本語変換を確定したあと、もう一回Enterキーを押さずに改行しているところとか、良いインスピレーションをいただけました。 実装フェーズまでにはもう少し時間があるので、地道にねばってみます。 本当にありがとうございました!

jamajamabo
質問者

補足

その後、参考にしたURLも載せておきます。 ■入力欄の文章を一定字数で強制改行するプログラム http://www.interq.or.jp/engineer/umechan/tips/35.htm ■文字数のお知らせ http://www.seasonsolution.jp/system/archive/08-07-31.html ■テキストボックス内のカーソル(キャレット)位置や選択範囲を,JavaScriptで取得・設定する方法 http://d.hatena.ne.jp/language_and_engineering/20090225/p1 ちなみにその後のわたしのプログラムは、以下のようになっています。 仕様を変更?妥協?して、ボタンを新たに一つ作り、それを押下すると改行するようになっています。 また、最終行だけでなく途中の行に文字列を追加しても消えずに改行するようにしました。 空白行も入ります。 まだまだなプログラムですが、l27074さんにいただいたインスピレーションのおかげで少しはすっきりしたでしょうか。 何かお知恵のある方、どうか教えてください! ******************************************* 呼び出し元 ******************************************* (略) <tr> <td class="itemLabelBtm"> フリー入力欄 </td> <td class="display" colspan=""> <textarea cols="85" rows="4" name="memo" style="overflow:auto" wrap="OFF"></textarea> <br> &nbsp;<font color="red">※1行には5文字まで入力できます。</font> <input type="button" name="test" onclick="lineCheck();showValue();" value="イメージ"> </td> </tr> (略) ******************************************* スクリプト部分 ******************************************* //イメージボタンを押下すると、alertでテキストエリアの値を表示します。 function showValue(){ var str=window.document.forms[0].memo.value; alert(str); } //イメージボタンを押下すると、テキストエリアの値を1行5文字で改行します。 function lineCheck(){ var ta = window.document.forms[0].memo; //一行の文字数指定 var col=5; var lines=ta.value.split("\r\n"); var newIndex = 0; var newValue = new Array(); for(var i=0;i<lines.length;i++){ if(lines[i].length ==0){ newValue[newIndex] = lines[i]; newIndex++; }else{ //余った分を次の行に振り替える。 //何回振替を行えばよいか、計算する。 var furikaeNum = Math.ceil((lines[i].length)/col); var j; for(j = 0;j < furikaeNum; j++){ newValue[newIndex] = lines[i].substring(col*j,col*(j+1)); newIndex++; } } } ta.value=newValue.join("\r\n"); //BLUEPIXYさんありがとう。 //l27074さんありがとう。 }

関連するQ&A

  • Javascriptのtextareaで、常に最終行を表示した状態 (

    Javascriptのtextareaで、常に最終行を表示した状態 (追加した文字列の最新の状態)にするには、どう記述すれば、良いのでしょうか? <textarea id="ta"></textarea>

  • 文字数カウントのJavaScriptについて

    現在プログラムを作成しています。 下記は、文字数をカウントするスクリプトです。 あいうえお と入力した値から「5」文字という 結果が l に入ります。 このプログラムは出来たのですが、 同じように、 I  Love  You という値を入れたら 「3」ワードという結果を l に入れる場合は どうすれば良いのでしょうか? Javaは殆ど知識がありません。 助けてください。 よろしくお願い致します。 <SCRIPT language="JavaScript"><!-- function count(f, val) { var l; if (!val) return; l = val.replace(/\s| /g, ""); f.a01.value = l.length; } //--></SCRIPT>

  • TEXTAREAにあらかじめ文字を表示させたい

    掲示板形式のCGIをダウンロードして、ど素人ですが自分なりに改造に挑戦しています。 表題の通り、TEXTAREAにあらかじめ文字を表示させたいのですが、うまくいきません。 <TEXTAREA rows=$row cols=$col name=$name_comment $css_style>$c_comment</TEXTAREA>\n"; 検索エンジンでやり方を検索してみても <TEXTAREA>ここに入力しておく</TEXTAREA> のやり方にしかたどり着けず・・・。 できれば、 (1) (2) (3) (4) (5) このように複数行をあらかじめ表示させたいと思っています。 どなたかご教授いただけると助かります。

    • ベストアンサー
    • Perl
  • Textareaの入力文字数チェックについて(タグ無視)

    TEXTAREAの文字数チェックまではできるのですが しかし、今回はHTMLのタグも入力されます。 タグを無視した文字数もカウントをやりたいです。 PHPにはそのような関数があったような気がしますが ... JavaScriptではどのようにすれば実現できるのでしょうか? タグの文法エラーはない前提でよいです。 よろしくお願いします。 <html> <head> <title>入力文字数のチェック</title> <script language="JavaScript"> function check() { txt = document.form1.sample.value; n = txt.length; if (n > 100) alert("100文字以内にしてください"); } </script> </head> <body> <form name="form1"> <textarea rows="10" name="sample" onChange="check()" cols="20"></textarea> </form> </body> </html>

  • javascriptで行を追加しながら行の色分け

    jQueryでボタンを押すと行が追加・削除されるようにしています。 var data; jQuery(function(){ jQuery('#add').click(function(){ var len = $("#tbl tbody").children().length; if(len>19){ $("#add").attr("disabled","disabed"); } data = '<tr><td>' + (len+1) + '</td><td><textarea name="clmn' + (len+1) + '" cols="30" rows="10"></textarea></td><td><img src="/images/noimage.gif" alt="img' + (len+1) + '" /></td><td><input type="file" name="image' + (len+1) + '" /></td></tr>'; jQuery('#tbl').append(data); }); jQuery('#del_bottom').click(function(){ if (jQuery('tbody tr').length) { jQuery('tbody tr:last').remove(); } }); }); ここで偶数行と奇数行の色を変化させようと $(document).ready(function(){ $("table").each(function(){ jQuery(this).find("tr:even").addClass("even"); }); $("table").each(function(){ jQuery(this).find("tr:odd").addClass("odd"); }); }); というスクリプトを用意しましたが、 同時に動かそうとしても動きません。 何か方法は無いでしょうか? 初期状態では色分けをされていますが、追加した段階で追加された行には適応されません。 詳しいかた教えていただけるでしょうか?

  • [javascript][IE] textarea内の改行を消す方法を教えてください。

    テキストエリア内の改行をreplaceで除去したいのですが、FireFoxではうまくいくのですがIEではうまく動作しません。 下記のようなソースです。 IEではどのように書けば良いのでしょうか。 <html> <head> <script type="text/javascript" language="javascript"> function change_box(){ temp = document.getElementById("in").value; temp = temp.replace(/\n/g,""); document.getElementById("out").value = temp; } </script> </head> <body> <form> <textarea id="in" rows="3" > 一行目 二行目 三行目 </textarea><br /> <textarea id="out" rows="3" ></textarea><br /> <input type="button" value="変換" onclick="change_box()"> </form> </body> </html>

  • javascriptでtextareaに文字列を追加したい

    textareaの最後尾に文字列を追加したいです。 いろいろサイトを検索してみたのですが、解決できず困っています。  <form>中に<textarea>とボタンを設定しておきボタンを押すと  文字列を最後尾に追加する。 というのはありました。 私は、ボタンは無しで、画面を読み終わったタイミングで、textareaの最後尾に文字列を追加したいのです。 (仕様で、bodyタグにonloadを記述することは出来ません。) (またcgiでHTML記述を生成しています。) が、どこかのサイトにあった例を見ても、どのように自分のソースに 反映したらよいのか分からず・・・。 サイトにあった例を参考に、下記のように記述してみましたが駄目でした。 <textarea name="textArea_A"></textarea> <SCRIPT LANGUAGE="JavaScript"> <!-- var objTextarea = document.getElementsByName('textArea_A')[0]; objTextarea.value += "AAA"; //--> </SCRIPT> (これで、<textarea name="textArea_A">AAA</textarea> となってくれると良いのですが・・・。) トンチンカンな意味不明な点があるかも知れませんが、 どうか宜しくお願いいたします。

  • javascript 文字制限について

    はじめまして。初心者でメールフォームを作成中です。 文字制限についてご教授ください。 初心者ながらどうにか6桁の文字制限をかける事が出来ました。 ここから最初の2桁のみ特定の数字(09)を入れなければエラーメッセージが表示されるようにしたいと考えています。 例:09****でないとエラーが出る この場合どうすればよいでしょうか? <HTML> <HEAD> <TITLE></TITLE> <SCRIPT language="JavaScript"> <!--// function restChar() { n = document.formN.textN.value.length; if(n > 6) alert("整理番号を正しく入力してください"); if(n < 6) alert("整理番号を正しく入力してください"); } //--> </SCRIPT> </HEAD> <BODY> 整理番号を入力してください <FORM name="formN"> <TEXTAREA rows="3" size="45" name="textN" onChange="restChar()"></TEXTAREA> </FORM> </BODY> </HTML> どうぞ宜しくお願いします。

  • javascriptの入力制限keycode除く

    はじめまして javascript初心者です テキストエリアに数字のみ入力できるようにしたいと思い 以下のとおりソースを記述しました function numCheck(){ var num = document.frm.txt.value; var cnum = num.replace(/[^0-9]/,""); num = cnum; document.frm.txt.value = num; <form name = "frm"> <input type="text" onkeypress="numCheck()" value="txt"> </form> キーコードによる入力制限は考えません あと何が足りないでしょうか? よろしくご教授くださいm(__)m

  • textareaで入力した文字を改行したままで表示したいのですが。

    textareaに複数行で入力した文字を改行したままで表示したいのですが 改行されずに表示されます。 改行したままで表示するのはどうすればいいでしょうか? <HTML> <HEAD> <STYLE type="text/css"> <!-- INPUT {font-size: 12px;} --> </STYLE> <SCRIPT language="JavaScript"> <!-- function check(){ var strName; strName = document.nform.textN.value; var test = document.getElementById("test"); test.innerHTML = strName; } //--> </SCRIPT> </HEAD> <BODY> <FORM name="nform" > <textarea cols="30" rows="10" name="textN"></textarea> <input type="button" value=" 確認 " onClick="check()"> </FORM> <DIV id="test" style="position:absolute;font-size:24px;"> </DIV> </BODY> </HTML>

    • ベストアンサー
    • HTML

専門家に質問してみよう