textareaの現在の行インデックスを取得する
http://oshiete.goo.ne.jp/qa/6845292.html
要素.selectionStart で文字(キャレット)位置がわかるも、どうしよう?
その前の行のインデント分の空白の取得?
テキストエリアでオートインデント。しかしキャレットが移動するのが見えて、ちょっぴり残念。(いやっ!それは仕様です)
<!DOCTYPE html> <title></title> <style> </style> <form action="#" id="FORM-1"> <p> <textarea rows="10" cols="80" name="hoge"></textarea> </p> <p> <textarea rows="10" cols="80" name="huga"></textarea> </p> </form> <script> (function () { var stock = []; function Indent (textarea) { this.node = textarea; } //イベント設定 function demo () { this.node.addEventListener ('keyup', this, false); } //イベントハンドラー function handler (event) { if (13 === event.which) add.call (this); } //インデント分の空白を挿入 function add () { var start = this.node.selectionStart; if (isNaN (start)) return; var value = this.node.value; var NotLF = /\r\n|\r/g; var region_byCaret = value.slice (0, start); var CRLFs = region_byCaret.match (NotLF); if (CRLFs) { region_byCaret = region_byCaret.replace (NotLF, '\n'); start -= CRLFs.length; } var region = region_byCaret; var lines = region.split ('\n'); var n = lines.length - 1; var spc; if (0 === lines[n].length) { if ((spc = lines[n-1].match (/^([\s\u3000]+)/))) { this.node.value = region_byCaret + spc[1] + value.slice (start); this.node.selectionStart = this.node.selectionEnd = start + spc[1].length; } } } function create (textarea) { if ('TEXTAREA' !== textarea.nodeName) return null; var obj = new Indent (textarea); var stock_no = stock.indexOf (textarea); if (-1 === stock_no) stock_no = stock.length; stock[stock_no] = textarea; obj.demo (); return obj; } //______________ Indent.prototype.handleEvent = handler; Indent.prototype.demo = demo; Indent.create = create; this.AutoIndent = Indent; })(); AutoIndent.create (document.querySelector ('textarea[name="hoge"]')); AutoIndent.create (document.querySelector ('textarea[name="huga"]')); </script>
テキストを正弦波でインデント!(思いつきで書くもんじゃないな)
<!DOCTYPE html> <title></title> <form> <p> <textarea rows="30" cols="80" name="hoge"> </textarea> </p> <p> <input type="button" value="test" onclick="test()"> </p> </form> <script type="text/javascript"> //text, 行数の振幅, 桁数の振幅, 1行の最大文字数 function sinWaveText (text, cycle, amplitude, colLength) { if (! text) return ''; if (! cycle) cycle = cycle || 10; if (! amplitude) amplitude = 10; if (! colLength) colLength = 25; amplitude /= 2; var result = []; var spc = '\u3000'; var deg = Math.PI / cycle; var lines = text.split (/\r\n|\r|\n/g); var idx = 0; var i, I; var reg; var tx; var t; var s; for (i = 0, I = lines.length; i < I; i++) { tx = lines[i].replace (/^[\s\u3000]*/, ''); reg = new RegExp ('(.{1,' + colLength + '})', 'g'); while (t = reg.exec (tx)) { s = (Math.sin (result.length * deg) * amplitude + amplitude) | 0; result.push ((new Array (s)).join(spc) + t[0]); } } return result.join ('\n'); } function test () { var e = document.querySelector ('textarea'); e.value = sinWaveText (e.value); } </script>