回答編集履歴

6

テキスト修正

2019/09/28 08:46

投稿

jun68ykt
jun68ykt

スコア9058

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

5

テキスト修正

2019/09/28 08:46

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -200,8 +200,4 @@
200
200
 
201
201
 
202
202
 
203
- ですが、このやり方だと、ひとつ文字を打つごとにフォームをサブミットしてWEBサーバーとの往復が生じてしまうので、実用的ではなさそうです。
204
-
205
-
206
-
207
- 調べたところ私の理解ですと、テキストエリア内で自動改行されたテキストが、その見た目どおりに改行コードを含む文字列になるのは、そのテキストエリアを含むフォームがサブミットされてサーバーへ送信される時点なので、上記のコードのようなトリッキーなことをしなければならないようです。
203
+ ですが、このやり方だと、ひとつ文字を打つごとにフォームをサブミットしてWEBサーバーとの往復が生じてしまうので、実用的ではなさそうですが、調べたところ私の理解ですと、テキストエリア内で自動改行されたテキストが、その見た目どおりに改行コードを含む文字列になるのは、そのテキストエリアを含むフォームがサブミットされてサーバーへ送信される時点なので、上記のコードのようなトリッキーなことをしなければならないようです

4

テキスト修正

2019/09/27 17:10

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -61,3 +61,147 @@
61
61
 
62
62
 
63
63
  との追記がありましたので、 `wrap` 属性を `off` にする上記の回答では、ご質問の要件を満たせていないと思われますので、上記回答は無視してください。自動折り返しされているテキストの行数カウントの方法が見つかれば、また追記します。(が、ざっと調べたところ簡単ではなさそうです。)
64
+
65
+
66
+
67
+ ### 追記2
68
+
69
+
70
+
71
+ 自動折り返しされているテキストの行数カウントの方法を調べたところ、stackoverflow に以下の記事を見つけました。
72
+
73
+
74
+
75
+ - stackoverflow: [html - Get wrapped text from textarea](https://stackoverflow.com/questions/10568876/html-get-wrapped-text-from-textarea)
76
+
77
+
78
+
79
+ 上記をもとに作成したHTMLが以下です。
80
+
81
+
82
+
83
+ ```html
84
+
85
+ <!DOCTYPE html>
86
+
87
+ <html lang="ja">
88
+
89
+ <head>
90
+
91
+ <meta charset="UTF-8">
92
+
93
+ <title>Q213634</title>
94
+
95
+ <script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
96
+
97
+ <script>
98
+
99
+
100
+
101
+ function getURLParameter(qs, name) {
102
+
103
+ const pattern = "[\?&]"+name+"=([^&#]*)";
104
+
105
+ const regex = new RegExp(pattern);
106
+
107
+ const res = regex.exec(qs);
108
+
109
+ if (res == null)
110
+
111
+ return "";
112
+
113
+ else
114
+
115
+ return res[1];
116
+
117
+ }
118
+
119
+
120
+
121
+ function getHardWrappedText() {
122
+
123
+ if (top.location.href !== window.location.href) return;
124
+
125
+
126
+
127
+ const frmUrl = $('iframe').get(0).contentDocument.URL;
128
+
129
+ if (frmUrl.indexOf('http') < 0) return;
130
+
131
+
132
+
133
+ return unescape(getURLParameter(frmUrl, 'text')).replace(/+/g,' ');
134
+
135
+ }
136
+
137
+
138
+
139
+ $(function(){
140
+
141
+ const linesCountUpdater = () => {
142
+
143
+ const text = getHardWrappedText();
144
+
145
+ if (!text) return;
146
+
147
+ const lines = text.split('\n');
148
+
149
+ $('span').text(lines.length);
150
+
151
+ };
152
+
153
+
154
+
155
+ $('iframe').on('load', linesCountUpdater);
156
+
157
+ $('textarea').on('keyup', () => { $('form').submit(); })
158
+
159
+ })
160
+
161
+ </script>
162
+
163
+ <style>
164
+
165
+ textarea { font-size: 36px; line-height: 36px; width: 200px; height: 220px; }
166
+
167
+ span { font-weight: bold; margin-right: 3px; }
168
+
169
+ </style>
170
+
171
+ </head>
172
+
173
+ <body>
174
+
175
+ 現在の行数:<span>0</span>行
176
+
177
+ <form method="get" target="hidden-frame">
178
+
179
+ <textarea name="text" wrap="hard"></textarea>
180
+
181
+ </form>
182
+
183
+ <iframe name="hidden-frame" style="display:none;"></iframe>
184
+
185
+ </body>
186
+
187
+ </html>
188
+
189
+
190
+
191
+ ```
192
+
193
+
194
+
195
+ 上記をコピペして HTMLファイルを作成し、何らかのWEBサーバー(Apache, Nginx など)経由でブラウザに表示させ、テキストエリアに文字を打っていくと、自動改行するごとに、現在の行数が更新されます。
196
+
197
+
198
+
199
+ ![イメージ説明](7009746cb7b60eeeff53e2e0fd8e1b29.png)
200
+
201
+
202
+
203
+ ですが、このやり方だと、ひとつ文字を打つごとにフォームをサブミットしてWEBサーバーとの往復が生じてしまうので、実用的ではなさそうです。
204
+
205
+
206
+
207
+ 調べたところ私の理解ですと、テキストエリア内で自動改行されたテキストが、その見た目どおりに改行コードを含む文字列になるのは、そのテキストエリアを含むフォームがサブミットされてサーバーへ送信される時点なので、上記のコードのようなトリッキーなことをしなければならないようです。

3

テキスト修正

2019/09/27 17:02

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -45,3 +45,19 @@
45
45
 
46
46
 
47
47
  参考になれば幸いです。
48
+
49
+
50
+
51
+ ### 追記
52
+
53
+
54
+
55
+ ご質問に
56
+
57
+
58
+
59
+ > 自動で折り返した時に一行としてカウントします。
60
+
61
+
62
+
63
+ との追記がありましたので、 `wrap` 属性を `off` にする上記の回答では、ご質問の要件を満たせていないと思われますので、上記回答は無視してください。自動折り返しされているテキストの行数カウントの方法が見つかれば、また追記します。(が、ざっと調べたところ簡単ではなさそうです。)

2

テキスト修正

2019/09/25 14:41

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -1,8 +1,20 @@
1
1
  こんにちは
2
+
3
+ 以下の3点を修正してみると、いかがでしょうか?
2
4
 
3
5
 
4
6
 
7
+
8
+
9
+ (1) `<textarea>` の属性に `wrap="off"` を追加
10
+
11
+
12
+
5
- `function()` を `function(e)` に修正したうえで、
13
+ (2) `function()` に引数 `e` 追加して、 `function(e)` に修正
14
+
15
+
16
+
17
+ (3) イベントハンドラの本体に、以下を追加
6
18
 
7
19
 
8
20
 
@@ -20,9 +32,11 @@
20
32
 
21
33
  ```
22
34
 
23
- を追加でいかがでしょう?
24
35
 
36
+
37
+
38
+
25
- 以下は、ご質問にある、動くサンプルをFork して、上記を追加したものです。
39
+ 以下は、ご質問にある、動くサンプルをFork して、上記の修正をしたものです。
26
40
 
27
41
 
28
42
 

1

テキスト修正

2019/09/25 06:21

投稿

jun68ykt
jun68ykt

スコア9058

test CHANGED
@@ -1,4 +1,8 @@
1
1
  こんにちは
2
+
3
+
4
+
5
+ `function()` を `function(e)` に修正したうえで、
2
6
 
3
7
 
4
8