質問するログイン新規登録

回答編集履歴

6

テキスト修正

2019/09/28 08:46

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -99,4 +99,4 @@
99
99
 
100
100
  ![イメージ説明](7009746cb7b60eeeff53e2e0fd8e1b29.png)
101
101
 
102
- ですが、このやり方だと、ひとつ文字を打つごとにフォームをサブミットしてWEBサーバーとの往復が生じてしまうので、実用的ではなさそうですが、調べたところ私の理解ですと、テキストエリア内で自動改行されたテキストが、その見た目どおりに改行コードを含む文字列になるのは、そのテキストエリアを含むフォームがサブミットされてサーバーへ送信される時点なので、上記のコードのようトリッキーなことをしなければならないようです。
102
+ このやり方だと、ひとつ文字を打つごとにフォームをサブミットしてWEBサーバーとの往復が生じてしまうので、実用的ではなさそうですが、調べたところ私の理解ですと、テキストエリア内で自動改行されたテキストが、その見た目どおりに改行コードを含む文字列になるのは、そのテキストエリアを含むフォームがサブミットされてサーバーへ送信される時点なので、上記のコードのように、隠しiframeを使うという、トリッキーなことをしなければならないようです。

5

テキスト修正

2019/09/28 08:46

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -99,6 +99,4 @@
99
99
 
100
100
  ![イメージ説明](7009746cb7b60eeeff53e2e0fd8e1b29.png)
101
101
 
102
- ですが、このやり方だと、ひとつ文字を打つごとにフォームをサブミットしてWEBサーバーとの往復が生じてしまうので、実用的ではなさそうです。
103
-
104
- 調べたところ私の理解ですと、テキストエリア内で自動改行されたテキストが、その見た目どおりに改行コードを含む文字列になるのは、そのテキストエリアを含むフォームがサブミットされてサーバーへ送信される時点なので、上記のコードのようなトリッキーなことをしなければならないようです。
102
+ ですが、このやり方だと、ひとつ文字を打つごとにフォームをサブミットしてWEBサーバーとの往復が生じてしまうので、実用的ではなさそうですが、調べたところ私の理解ですと、テキストエリア内で自動改行されたテキストが、その見た目どおりに改行コードを含む文字列になるのは、そのテキストエリアを含むフォームがサブミットされてサーバーへ送信される時点なので、上記のコードのようなトリッキーなことをしなければならないようです

4

テキスト修正

2019/09/27 17:10

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -29,4 +29,76 @@
29
29
 
30
30
  > 自動で折り返した時に一行としてカウントします。
31
31
 
32
- との追記がありましたので、 `wrap` 属性を `off` にする上記の回答では、ご質問の要件を満たせていないと思われますので、上記回答は無視してください。自動折り返しされているテキストの行数カウントの方法が見つかれば、また追記します。(が、ざっと調べたところ簡単ではなさそうです。)
32
+ との追記がありましたので、 `wrap` 属性を `off` にする上記の回答では、ご質問の要件を満たせていないと思われますので、上記回答は無視してください。自動折り返しされているテキストの行数カウントの方法が見つかれば、また追記します。(が、ざっと調べたところ簡単ではなさそうです。)
33
+
34
+ ### 追記2
35
+
36
+ 自動折り返しされているテキストの行数カウントの方法を調べたところ、stackoverflow に以下の記事を見つけました。
37
+
38
+ - stackoverflow: [html - Get wrapped text from textarea](https://stackoverflow.com/questions/10568876/html-get-wrapped-text-from-textarea)
39
+
40
+ 上記をもとに作成したHTMLが以下です。
41
+
42
+ ```html
43
+ <!DOCTYPE html>
44
+ <html lang="ja">
45
+ <head>
46
+ <meta charset="UTF-8">
47
+ <title>Q213634</title>
48
+ <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
49
+ <script>
50
+
51
+ function getURLParameter(qs, name) {
52
+ const pattern = "[\?&]"+name+"=([^&#]*)";
53
+ const regex = new RegExp(pattern);
54
+ const res = regex.exec(qs);
55
+ if (res == null)
56
+ return "";
57
+ else
58
+ return res[1];
59
+ }
60
+
61
+ function getHardWrappedText() {
62
+ if (top.location.href !== window.location.href) return;
63
+
64
+ const frmUrl = $('iframe').get(0).contentDocument.URL;
65
+ if (frmUrl.indexOf('http') < 0) return;
66
+
67
+ return unescape(getURLParameter(frmUrl, 'text')).replace(/+/g,' ');
68
+ }
69
+
70
+ $(function(){
71
+ const linesCountUpdater = () => {
72
+ const text = getHardWrappedText();
73
+ if (!text) return;
74
+ const lines = text.split('\n');
75
+ $('span').text(lines.length);
76
+ };
77
+
78
+ $('iframe').on('load', linesCountUpdater);
79
+ $('textarea').on('keyup', () => { $('form').submit(); })
80
+ })
81
+ </script>
82
+ <style>
83
+ textarea { font-size: 36px; line-height: 36px; width: 200px; height: 220px; }
84
+ span { font-weight: bold; margin-right: 3px; }
85
+ </style>
86
+ </head>
87
+ <body>
88
+ 現在の行数:<span>0</span>行
89
+ <form method="get" target="hidden-frame">
90
+ <textarea name="text" wrap="hard"></textarea>
91
+ </form>
92
+ <iframe name="hidden-frame" style="display:none;"></iframe>
93
+ </body>
94
+ </html>
95
+
96
+ ```
97
+
98
+ 上記をコピペして HTMLファイルを作成し、何らかのWEBサーバー(Apache, Nginx など)経由でブラウザに表示させ、テキストエリアに文字を打っていくと、自動改行するごとに、現在の行数が更新されます。
99
+
100
+ ![イメージ説明](7009746cb7b60eeeff53e2e0fd8e1b29.png)
101
+
102
+ ですが、このやり方だと、ひとつ文字を打つごとにフォームをサブミットしてWEBサーバーとの往復が生じてしまうので、実用的ではなさそうです。
103
+
104
+ 調べたところ私の理解ですと、テキストエリア内で自動改行されたテキストが、その見た目どおりに改行コードを含む文字列になるのは、そのテキストエリアを含むフォームがサブミットされてサーバーへ送信される時点なので、上記のコードのようなトリッキーなことをしなければならないようです。

3

テキスト修正

2019/09/27 17:02

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -21,4 +21,12 @@
21
21
 
22
22
  - [https://codepen.io/jun68ykt/pen/NWKJrjp?editors=0011](https://codepen.io/jun68ykt/pen/NWKJrjp?editors=0011)
23
23
 
24
- 参考になれば幸いです。
24
+ 参考になれば幸いです。
25
+
26
+ ### 追記
27
+
28
+ ご質問に
29
+
30
+ > 自動で折り返した時に一行としてカウントします。
31
+
32
+ との追記がありましたので、 `wrap` 属性を `off` にする上記の回答では、ご質問の要件を満たせていないと思われますので、上記回答は無視してください。自動折り返しされているテキストの行数カウントの方法が見つかれば、また追記します。(が、ざっと調べたところ簡単ではなさそうです。)

2

テキスト修正

2019/09/25 14:41

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -1,7 +1,13 @@
1
1
  こんにちは
2
+ 以下の3点を修正してみると、いかがでしょうか?
2
3
 
3
- `function()` を `function(e)` に修正したうえで、
4
4
 
5
+ (1) `<textarea>` の属性に `wrap="off"` を追加
6
+
7
+ (2) `function()` に引数 `e` を追加して、 `function(e)` に修正
8
+
9
+ (3) イベントハンドラの本体に、以下を追加
10
+
5
11
  ```javascript
6
12
  if (e.type === 'keydown' && e.keyCode === 13) {
7
13
  const lines = e.target.value.split('\n');
@@ -9,9 +15,10 @@
9
15
  e.preventDefault()
10
16
  }
11
17
  ```
12
- を追加でいかがでしょう?
13
- 以下は、ご質問にある、動くサンプルをFork して、上記を追加したものです。
14
18
 
19
+
20
+ 以下は、ご質問にある、動くサンプルをFork して、上記の修正をしたものです。
21
+
15
22
  - [https://codepen.io/jun68ykt/pen/NWKJrjp?editors=0011](https://codepen.io/jun68ykt/pen/NWKJrjp?editors=0011)
16
23
 
17
24
  参考になれば幸いです。

1

テキスト修正

2019/09/25 06:21

投稿

jun68ykt
jun68ykt

スコア9058

answer CHANGED
@@ -1,5 +1,7 @@
1
1
  こんにちは
2
2
 
3
+ `function()` を `function(e)` に修正したうえで、
4
+
3
5
  ```javascript
4
6
  if (e.type === 'keydown' && e.keyCode === 13) {
5
7
  const lines = e.target.value.split('\n');