質問編集履歴

10

過去のコードを参照として復活させる

2019/01/03 14:24

投稿

_sz
_sz

スコア21

test CHANGED
File without changes
test CHANGED
@@ -47,3 +47,389 @@
47
47
  参考サイト
48
48
 
49
49
  [javascriptで文字列内に任意の文字列が含まれているかをtrue/falseで返す](https://qiita.com/yuskamiya/items/14f0ffdd459419721a52)
50
+
51
+
52
+
53
+
54
+
55
+ ▼▼▼以下は、過去のコードと質問です▼▼▼
56
+
57
+
58
+
59
+ 【2018/09/24のコード】
60
+
61
+ ```html
62
+
63
+ <body>
64
+
65
+ <div id="container">
66
+
67
+ [String.indexOfメソッド](https://algorithm.joho.info/programming/javascript/string-partial-match-js/)で文字列の部分一致を判定しようとしていますが、
68
+
69
+ その箇所が上手くいっていません。
70
+
71
+ <form action="#">
72
+
73
+ <input type="text" id="inputText" placeholder="文字を入力してください" onkeyup="addValue()">
74
+
75
+ <input type="button" value="検索">
76
+
77
+ </form>
78
+
79
+ <div id="inputTextPv"></div>
80
+
81
+ <div id="parent">
82
+
83
+ <p>りんご</p>
84
+
85
+ <p>みかん</p>
86
+
87
+ <p>みかん</p>
88
+
89
+ <p>りんご</p>
90
+
91
+ <p>りんご</p>
92
+
93
+ <p>パイナップル</p>
94
+
95
+ </div>
96
+
97
+ </div>
98
+
99
+ <script>
100
+
101
+ // リアルタイムで入力された文字列を取得
102
+
103
+ function addValue(){
104
+
105
+ var idname = "inputText";
106
+
107
+ s = document.getElementById(idname).value;
108
+
109
+ var pvname = idname + "Pv";
110
+
111
+ document.getElementById(pvname).innerHTML = s;
112
+
113
+ }
114
+
115
+ // 比較するp要素を取得
116
+
117
+ var parent = document.getElementById('parent');
118
+
119
+ var child = parent.children;
120
+
121
+ console.log(child);
122
+
123
+ // 比較するp要素の文字列を取得 ※できない
124
+
125
+ console.log(child.textContents); //undefind
126
+
127
+ console.log(child.innerHTML); //undefind
128
+
129
+ // 入力された文字列とp要素の文字列を比較する ※できない
130
+
131
+ var result = child.search(search);
132
+
133
+ console.log(result);
134
+
135
+ </script>
136
+
137
+ </body>
138
+
139
+ ```
140
+
141
+ ```CSS
142
+
143
+ /* container */
144
+
145
+ #container {
146
+
147
+ width: 520px;
148
+
149
+ margin: 100px auto;
150
+
151
+ }
152
+
153
+ /* form */
154
+
155
+ form {
156
+
157
+ font-size: 0;
158
+
159
+ }
160
+
161
+ input {
162
+
163
+ font-size: 1.4rem;
164
+
165
+ appearance: none;
166
+
167
+ height: 48px;
168
+
169
+ }
170
+
171
+ input:focus {
172
+
173
+ outline: none;
174
+
175
+ }
176
+
177
+ input[type="text"] {
178
+
179
+ width: 400px;
180
+
181
+ padding: 0 10px;
182
+
183
+ }
184
+
185
+ input[type="submit"] {
186
+
187
+ width: 80px;
188
+
189
+ border: none;
190
+
191
+ }
192
+
193
+ input[type="submit"]:hover {
194
+
195
+ opacity: 0.5;
196
+
197
+ }
198
+
199
+ /* リアルタイムで入力された文字を表示してみるエリア */
200
+
201
+ #inputTextPv {
202
+
203
+ border: 1px solid red;
204
+
205
+ height: 48px;
206
+
207
+ line-height: 48px;
208
+
209
+ padding: 0 10px;
210
+
211
+ }
212
+
213
+ /* p要素のエリア */
214
+
215
+ #parent {
216
+
217
+ border: 1px solid blue;
218
+
219
+ padding: 0 10px;
220
+
221
+ }
222
+
223
+ ```
224
+
225
+ 【2018/09/24の修正に関する質問】
226
+
227
+
228
+
229
+ **【実現したいこと】**
230
+
231
+ ページ内検索で、検索した文字を含むp要素のみを表示し、それ以外のp要素は非表示にしたいです。
232
+
233
+ また、「検索」のボタンを押さずとも、入力した時点ですでに上記の状態となるようにしたいです。
234
+
235
+ **※なるべくjQueryは使わず、ネイティブJSで作れると嬉しいです。**
236
+
237
+ **【現状】**
238
+
239
+ ●できていること
240
+
241
+ ・検索のテキストボックスに入力された文字の取得
242
+
243
+ ・p要素の取得
244
+
245
+ ●できていないこと
246
+
247
+ ・p要素の文字列の取得(これができないと、入力された文字列との比較は不可能?)
248
+
249
+ p要素の文字列を取得できそうに思える、.textContents と .innerHTML を試しましたが、どちらもundefindでした。他の方法も探したのですが、見つけることができませんでした。
250
+
251
+ ・入力された文字列と、p要素の文字列の比較
252
+
253
+ p要素の文字列が取得できていないので、この段階まで辿り着けていないのですが、search を使うと検索をして一致した位置を「数値」で返してくれるとのことなので、その数値を使ってp要素の表示/非表示を切り替えられるのではないかと考えています。
254
+
255
+ ・該当p要素の表示と、それ以外のp要素の非表示
256
+
257
+ display: block / none; でできるのではないかと考えています。
258
+
259
+
260
+
261
+ ---
262
+
263
+ 【2018/12/01のコード】
264
+
265
+ ```HTML
266
+
267
+ <body>
268
+
269
+ <div id="container">
270
+
271
+
272
+
273
+ <form action="#">
274
+
275
+ <input type="text" id="inputText" placeholder="文字を入力してください">
276
+
277
+ <input type="button" value="検索">
278
+
279
+ </form>
280
+
281
+ <div id="inputTextPv" class="inputTextPv"></div>
282
+
283
+
284
+
285
+ <div id="parent">
286
+
287
+ <p>りんご</p>
288
+
289
+ <p>みかん</p>
290
+
291
+ <p>みかん</p>
292
+
293
+ <p>りんご</p>
294
+
295
+ <p>りんご</p>
296
+
297
+ <p>パイナップル</p>
298
+
299
+ </div>
300
+
301
+
302
+
303
+ </div>
304
+
305
+ <script>
306
+
307
+ (function () {
308
+
309
+ // parentのテキストたちを取得
310
+
311
+ const parent = document.getElementById('parent');
312
+
313
+ const children = parent.children;
314
+
315
+ for (var child = 0; child < children.length; child++) {
316
+
317
+ // console.log(children[ child ].textContent);
318
+
319
+ child.dataset.value = children[ child ].textContent;
320
+
321
+ }
322
+
323
+ // inputに入力されたテキストをリアルタイムで取得
324
+
325
+ function addValue(e) {
326
+
327
+ var inputText = document.getElementById("inputText");
328
+
329
+ inputText.addEventListener('keyup', function () {
330
+
331
+ var s = inputText.value;
332
+
333
+ document.getElementById("inputTextPv").textContent = s;
334
+
335
+ }, false);
336
+
337
+ }
338
+
339
+ // inputに入力されたテキストのdata-value属性に設定された値を検索
340
+
341
+ function searchText(text) {
342
+
343
+ return document.querySelectorAll(`[data-value="${text}"]`);
344
+
345
+ }
346
+
347
+ function getList() {
348
+
349
+ const e = document.getElementById('inputText').addEventListener('input');
350
+
351
+ addValue();
352
+
353
+ const nodeList = searchText(e.target.value);
354
+
355
+ // inputに入力されたテキストと同じテキストを持つparent内のp要素をConsoleに表示
356
+
357
+ console.log(nodeList);
358
+
359
+ }
360
+
361
+ })();
362
+
363
+ </script>
364
+
365
+ </body>
366
+
367
+ ```
368
+
369
+ 【2018/12/01の修正に関する質問】
370
+
371
+
372
+
373
+ **●parentのテキストたちを取得 について**
374
+
375
+ ループでdata-value属性に自身のもつテキストノードの値を入れています。
376
+
377
+ IE11でも動作させたかったのでfor文を用いましたが、「value」に関してエラーが出ておりJSが動かない状態です。
378
+
379
+ どうすれば良いでしょうか?
380
+
381
+ エラー文:Uncaught TypeError: Cannot set property 'value' of undefined
382
+
383
+
384
+
385
+ **●searchText について**
386
+
387
+ ```HTML
388
+
389
+ function searchText(text) {
390
+
391
+ ```
392
+
393
+ とありますが、この(text)は何を示しているのでしょうか?
394
+
395
+ この()は宣言した変数を入れる場所であると思っていたのですが、宣言していない何かも入れることが可能なのでしょうか?
396
+
397
+ また、
398
+
399
+ ```HTML
400
+
401
+ return document.querySelectorAll(`[data-value="${text}"]`);
402
+
403
+ ```
404
+
405
+ の箇所でテンプレートリテラルを使用しておりますが、
406
+
407
+ このテンプレートリテラルを用いたdata-value属性を表す書き方を調べても、
408
+
409
+ 同じ書き方が見つかりませんでした。
410
+
411
+ 何かこのようなdata-value属性の書き方の、名称などはありますでしょうか?
412
+
413
+
414
+
415
+ **●getList について**
416
+
417
+ いただきましたアドバイスでは、アロー関数を使用されていましたが
418
+
419
+ よく分からなかったのでアロー関数ではない普通の書き方?にしてみました。
420
+
421
+ 正しく書き換えられていますでしょうか?
422
+
423
+
424
+
425
+ **●最後の行「 })();」 について**
426
+
427
+ この行も、前述した「value」に関してのエラーの対象行のようです。
428
+
429
+ 「JavaScriptは全体を即時関数で囲いつつ、
430
+
431
+ use strictキーワードで厳密なエラーチェックをすることが推奨されている。」
432
+
433
+ と知ったので、それも盛り込もうとしていますが、そのせいでしょうか?
434
+
435
+ こちらのエラーを解消するにはどうすれば良いでしょうか?

9

タイトル修正

2019/01/03 14:24

投稿

_sz
_sz

スコア21

test CHANGED
@@ -1 +1 @@
1
- 【JavaScript】inputに入力する都度発火するようにしたい
1
+ 【JavaScript】inputに入力されたテキストと一致しないp要素を非表示にする方法
test CHANGED
File without changes

8

質問の更新

2019/01/03 14:17

投稿

_sz
_sz

スコア21

test CHANGED
@@ -1 +1 @@
1
- 【JavaScript】inputに入力されテキストと一致しなp要素を非表示にする方法
1
+ 【JavaScript】inputに入力する都度発火するようにしたい
test CHANGED
@@ -1,8 +1,18 @@
1
1
  閲覧ありがとうございます。
2
2
 
3
- inputに入力されたテキストと一致しないp要素を非表示にしたいです。
4
3
 
5
4
 
5
+ ▼質問
6
+
7
+ 初めてinputへ入力した時に限らず、
8
+
9
+ 入力したものを全て消した後の書き直しなども含め
10
+
11
+ inputに入力するたび、発火させる方法
12
+
13
+
14
+
15
+ ▼最終的につくりたいもの
6
16
 
7
17
  「りんご」「りんごかな」「みかん」「パイナップル」といったp要素があり、
8
18
 
@@ -10,22 +20,30 @@
10
20
 
11
21
  完全に一致、もしくは部分一致の「りんご」「りんごかな」は表示したままに、
12
22
 
13
- それ以外の「みかん」「パイナップル」には、クラスhiddenを付け非表示にさせたいです。
23
+ それ以外の「みかん」「パイナップル」には、クラスhiddenを付け非表示にす
14
24
 
15
25
 
16
26
 
17
- [String.indexOfメソッド](https://algorithm.joho.info/programming/javascript/string-partial-match-js/)で文字列の部分一致を判定しようとしていますが、
27
+ ▼問題点
18
28
 
29
+ 現段階では、実現できているように見えますが、
30
+
31
+ 「りんご」とinputに入力した後、
32
+
33
+ 入力したテキストを一旦全て消し、
34
+
35
+ 新たに「みかん」と打つと、
36
+
19
- その箇所が上手っていません
37
+ 動作しなくなっている状況です
20
38
 
21
39
 
22
40
 
23
41
  ▼コード
24
42
 
25
- [CodePen](https://codepen.io/0166_0166/pen/qLVpKe)
43
+ [CodePen](https://codepen.io/0166/pen/pqdYXe)
26
44
 
27
45
 
28
46
 
29
- 以上になります。
47
+ 参考サイト
30
48
 
31
- 入りますが、ご教授のほどよろしくお願いたしま
49
+ [javascriptで文字列内に任意の文字列が含まるかをtrue/falseで返](https://qiita.com/yuskamiya/items/14f0ffdd459419721a52)

7

タイトル修正

2019/01/01 13:51

投稿

_sz
_sz

スコア21

test CHANGED
@@ -1 +1 @@
1
- inputに入力されたテキストと一致しないp要素を非表示にする方法
1
+ 【JavaScript】inputに入力されたテキストと一致しないp要素を非表示にする方法
test CHANGED
File without changes

6

質問更新

2018/12/31 12:57

投稿

_sz
_sz

スコア21

test CHANGED
@@ -1 +1 @@
1
- ページ内検索で、検索た文字列を含むp要素をネイティブJSで表示したい
1
+ inputに入力されたテキストと一致ないp要素を表示にする方法
test CHANGED
@@ -1,704 +1,28 @@
1
1
  閲覧ありがとうございます。
2
2
 
3
- ページ内検索で、検索た文字列を含むp要素をネイティブJSで表示したいです。
3
+ inputに入力されたテキストと一致ないp要素を表示したいです。
4
4
 
5
5
 
6
6
 
7
- 例えば、「りんご」とinputに打つと
7
+ 「りんご」「りんごかな」「みかん」「パイナップル」いったp要素があり
8
8
 
9
- 表示されてい「みかん」や「パイナップル」は消え
9
+ inputに「りんご」と入力された場合
10
10
 
11
- 「りんご」だけが表示されている状態なる
11
+ 完全に一致、もしくは部分一致の「りんご」「りんごかな」は表示したまま
12
12
 
13
- った感じです。
13
+ それ以外の「みかん」「パイナップル」には、クラスhiddenを付け非表示にさせたいです。
14
14
 
15
15
 
16
16
 
17
- ---
17
+ [String.indexOfメソッド](https://algorithm.joho.info/programming/javascript/string-partial-match-js/)で文字列の部分一致を判定しようとしていますが、
18
18
 
19
- 【2018/09/24のコード】
20
-
21
- ```html
22
-
23
- <body>
19
+ その箇所が上手くいっていません。
24
-
25
- <div id="container">
26
20
 
27
21
 
28
22
 
29
- <form action="#">
23
+ ▼コード
30
24
 
31
- <input type="text" id="inputText" placeholder="文字を入力してください" onkeyup="addValue()">
32
-
33
- <input type="button" value="検索">
34
-
35
- </form>
36
-
37
-
38
-
39
- <div id="inputTextPv"></div>
40
-
41
-
42
-
43
- <div id="parent">
44
-
45
- <p>りんご</p>
46
-
47
- <p>みかん</p>
48
-
49
- <p>みかん</p>
50
-
51
- <p>りんご</p>
52
-
53
- <p>りんご</p>
54
-
55
- <p>パイナップル</p>
56
-
57
- </div>
58
-
59
-
60
-
61
- </div>
62
-
63
-
64
-
65
- <script>
66
-
67
- // リアルタイムで入力された文字列を取得
68
-
69
- function addValue(){
70
-
71
- var idname = "inputText";
72
-
73
- s = document.getElementById(idname).value;
74
-
75
- var pvname = idname + "Pv";
76
-
77
- document.getElementById(pvname).innerHTML = s;
78
-
79
- }
80
-
81
-
82
-
83
- // 比較するp要素を取得
84
-
85
- var parent = document.getElementById('parent');
86
-
87
- var child = parent.children;
88
-
89
- console.log(child);
90
-
91
-
92
-
93
- // 比較するp要素の文字列を取得 ※できない
94
-
95
- console.log(child.textContents); //undefind
96
-
97
- console.log(child.innerHTML); //undefind
98
-
99
-
100
-
101
- // 入力された文字列とp要素の文字列を比較する ※できない
102
-
103
- var result = child.search(search);
104
-
105
- console.log(result);
106
-
107
-
108
-
109
- </script>
110
-
111
- </body>
112
-
113
-
114
-
115
- ```
116
-
117
- ```CSS
118
-
119
- /* container */
120
-
121
- #container {
122
-
123
- width: 520px;
124
-
125
- margin: 100px auto;
126
-
127
- }
128
-
129
-
130
-
131
- /* form */
132
-
133
- form {
134
-
135
- font-size: 0;
136
-
137
- }
138
-
139
- input {
140
-
141
- font-size: 1.4rem;
142
-
143
- appearance: none;
144
-
145
- height: 48px;
146
-
147
- }
148
-
149
- input:focus {
150
-
151
- outline: none;
152
-
153
- }
154
-
155
- input[type="text"] {
156
-
157
- width: 400px;
158
-
159
- padding: 0 10px;
160
-
161
- }
162
-
163
- input[type="submit"] {
164
-
165
- width: 80px;
166
-
167
- border: none;
168
-
169
- }
170
-
171
- input[type="submit"]:hover {
172
-
173
- opacity: 0.5;
174
-
175
- }
176
-
177
-
178
-
179
- /* リアルタイムで入力された文字を表示してみるエリア */
180
-
181
- #inputTextPv {
182
-
183
- border: 1px solid red;
184
-
185
- height: 48px;
186
-
187
- line-height: 48px;
188
-
189
- padding: 0 10px;
190
-
191
- }
192
-
193
-
194
-
195
- /* p要素のエリア */
196
-
197
- #parent {
198
-
199
- border: 1px solid blue;
200
-
201
- padding: 0 10px;
202
-
203
- }
204
-
205
- ```
206
-
207
- ---
208
-
209
- 【2018/12/01のコード】
210
-
211
-
212
-
213
- ```HTML
214
-
215
- <body>
216
-
217
- <div id="container">
218
-
219
-
220
-
221
- <form action="#">
222
-
223
- <input type="text" id="inputText" placeholder="文字を入力してください">
224
-
225
- <input type="button" value="検索">
226
-
227
- </form>
228
-
229
-
230
-
231
- <div id="inputTextPv" class="inputTextPv"></div>
232
-
233
-
234
-
235
- <div id="parent">
236
-
237
- <p>りんご</p>
238
-
239
- <p>みかん</p>
240
-
241
- <p>みかん</p>
242
-
243
- <p>りんご</p>
244
-
245
- <p>りんご</p>
246
-
247
- <p>パイナップル</p>
248
-
249
- </div>
250
-
251
-
252
-
253
- </div>
254
-
255
- <script>
256
-
257
- (function () {
258
-
259
-
260
-
261
-
262
-
263
- // parentのテキストたちを取得
264
-
265
- const parent = document.getElementById('parent');
266
-
267
- const children = parent.children;
268
-
269
- for (var child = 0; child < children.length; child++) {
270
-
271
- // console.log(children[ child ].textContent);
272
-
273
- child.dataset.value = children[ child ].textContent;
274
-
275
- }
276
-
277
-
278
-
279
-
280
-
281
- // inputに入力されたテキストをリアルタイムで取得
282
-
283
- function addValue(e) {
284
-
285
- var inputText = document.getElementById("inputText");
286
-
287
- inputText.addEventListener('keyup', function () {
288
-
289
- var s = inputText.value;
290
-
291
- document.getElementById("inputTextPv").textContent = s;
292
-
293
- }, false);
294
-
295
- }
296
-
297
-
298
-
299
-
300
-
301
- // inputに入力されたテキストのdata-value属性に設定された値を検索
302
-
303
- function searchText(text) {
304
-
305
- return document.querySelectorAll(`[data-value="${text}"]`);
306
-
307
- }
308
-
309
-
310
-
311
-
312
-
313
- function getList() {
314
-
315
- const e = document.getElementById('inputText').addEventListener('input');
316
-
317
- addValue();
318
-
319
- const nodeList = searchText(e.target.value);
320
-
321
- // inputに入力されたテキストと同じテキストを持つparent内のp要素をConsoleに表示
322
-
323
- console.log(nodeList);
324
-
325
- }
326
-
327
-
328
-
329
-
330
-
331
- })();
332
-
333
-
334
-
335
- </script>
336
-
337
- </body>
338
-
339
-
340
-
341
-
342
-
343
- ```
344
-
345
- ---
346
-
347
- 【2018/12/01の修正に関する質問】
348
-
349
-
350
-
351
- **●parentのテキストたちを取得 について**
352
-
353
- ループでdata-value属性に自身のもつテキストノードの値を入れています。
354
-
355
- IE11でも動作させたかったのでfor文を用いましたが、「value」に関してエラーが出ておりJSが動かない状態です。
356
-
357
- どうすれば良いでしょうか?
358
-
359
-
360
-
361
- エラー文:Uncaught TypeError: Cannot set property 'value' of undefined
362
-
363
-
364
-
365
- **●searchText について**
366
-
367
- ```HTML
368
-
369
- function searchText(text) {
370
-
371
- ```
372
-
373
- とありますが、この(text)は何を示しているのでしょうか?
374
-
375
- この()は宣言した変数を入れる場所であると思っていたのですが、宣言していない何かも入れることが可能なのでしょうか?
376
-
377
-
378
-
379
- また、
380
-
381
- ```HTML
382
-
383
- return document.querySelectorAll(`[data-value="${text}"]`);
384
-
385
- ```
386
-
387
- の箇所でテンプレートリテラルを使用しておりますが、
388
-
389
- このテンプレートリテラルを用いたdata-value属性を表す書き方を調べても、
390
-
391
- 同じ書き方が見つかりませんでした。
392
-
393
- 何かこのようなdata-value属性の書き方の、名称などはありますでしょうか?
394
-
395
-
396
-
397
-
398
-
399
- **●getList について**
400
-
401
- いただきましたアドバイスでは、アロー関数を使用されていましたが
402
-
403
- よく分からなかったのでアロー関数ではない普通の書き方?にしてみました。
404
-
405
- 正しく書き換えられていますでしょうか?
406
-
407
-
408
-
409
- **●最後の行「 })();」 について**
410
-
411
- この行も、前述した「value」に関してのエラーの対象行のようです。
412
-
413
- 「JavaScriptは全体を即時関数で囲いつつ、
414
-
415
- use strictキーワードで厳密なエラーチェックをすることが推奨されている。」
416
-
417
- と知ったので、それも盛り込もうとしていますが、そのせいでしょうか?
418
-
419
- こちらのエラーを解消するにはどうすれば良いでしょうか?
420
-
421
-
422
-
423
- ---
424
-
425
- ☆最新☆【いただいたアドバイスを踏まえ、修正したコード】
426
-
427
- **【修正①】(2018/12/09)**
428
-
429
-
430
-
431
- ```HTML
432
-
433
- <body>
434
-
435
- <div id="container">
436
-
437
-
438
-
439
- <form action="#">
440
-
441
- <input type="text" id="inputText" placeholder="文字を入力してください">
442
-
443
- <input type="button" value="検索">
444
-
445
- </form>
446
-
447
-
448
-
449
- <div id="parent">
450
-
451
- <p>りんご</p>
452
-
453
- <p>みかん</p>
454
-
455
- <p>みかん</p>
456
-
457
- <p>りんご</p>
458
-
459
- <p>りんご</p>
460
-
461
- <p>パイナップル</p>
462
-
463
- </div>
464
-
465
-
466
-
467
- </div>
468
-
469
- <script>
470
-
471
- (function () {
472
-
473
-
474
-
475
- 'use strict';
476
-
477
-
478
-
479
- // parentのテキストたちを取得
480
-
481
- const parent = document.getElementById('parent');
482
-
483
- const children = parent.children;
484
-
485
- for (var i = 0; i < children.length; i++) {
486
-
487
- children[i].dataset.value = children[i].textContent;
488
-
489
- // console.log(children[i].dataset.value);
490
-
491
- }
492
-
493
-
494
-
495
-
496
-
497
- // inputに入力されたテキストをリアルタイムで取得
498
-
499
- function addValue(e) {
500
-
501
- var inputText = document.getElementById("inputText");
502
-
503
- inputText.addEventListener('keyup', function () {
504
-
505
- var s = inputText.value;
506
-
507
- console.log(s);
508
-
509
- }, false);
510
-
511
- }
512
-
513
-
514
-
515
-
516
-
517
- // inputに入力されたテキストのdata-value属性に設定された値を検索
518
-
519
- function searchText(text) {
520
-
521
- return document.querySelectorAll(`[data-value="${text}"]`);
522
-
523
- }
524
-
525
-
526
-
527
-
528
-
529
- function getList(e) {
530
-
531
- const e = document.getElementById('inputText').addEventListener('input');
532
-
533
- addValue();
534
-
535
- const nodeList = searchText(e.target.value);
536
-
537
-
538
-
539
- // inputに入力されたテキストと同じテキストを持つparent内のp要素をConsoleに表示
540
-
541
- console.log(nodeList);
542
-
543
- }
544
-
545
-
546
-
547
- })();
548
-
549
- </script>
550
-
551
- </body>
552
-
553
- ```
554
-
555
- ---
556
-
557
- **【修正②】(2018/12/09)**
558
-
559
- ```HTML
560
-
561
- <body>
562
-
563
- <div id="container">
564
-
565
-
566
-
567
- <form action="#">
568
-
569
- <input type="text" id="inputText" placeholder="文字を入力してください">
570
-
571
- <input type="button" value="検索">
572
-
573
- </form>
574
-
575
-
576
-
577
- <div id="parent">
578
-
579
- <p>りんご</p>
580
-
581
- <p>みかん</p>
582
-
583
- <p>みかん</p>
584
-
585
- <p>りんご</p>
586
-
587
- <p>りんご</p>
588
-
589
- <p>パイナップル</p>
590
-
591
- </div>
592
-
593
-
594
-
595
- </div>
596
-
597
- <script>
598
-
599
- (function () {
600
-
601
-
602
-
603
- 'use strict';
604
-
605
- function addValue() {
606
-
607
- var idname = "inputText";
608
-
609
- searchText = document.getElementById(idname).value;
610
-
611
- // グローバルの配列 textArray から searchText と同じ文字列の場合のみ抽出して新たな配列 newArray に入れていく
612
-
613
- var newArray = textArray.filter(function (value) {
614
-
615
- return value === searchText;
616
-
617
- });
618
-
619
-
620
-
621
- if (newArray.length != 0) {//newArrayに中身があった場合の処理
622
-
623
- //いったん parentの中身を全て消す処理
624
-
625
- while (parent.firstChild) {//parentのfirstChildが存在すれば
626
-
627
- parent.removeChild(parent.firstChild);//parentのfirstChildを消す
628
-
629
- }
630
-
631
- //newArrayの中身の数だけ繰り返しながら 新しく p要素を追加
632
-
633
- for (var i = 0, len = newArray.length; i < len; ++i) {
634
-
635
- var element = document.createElement('p');// 新しいp要素を作る
636
-
637
- element.innerText = newArray[i];//新しいpにテキストを入れる
638
-
639
- parent.appendChild(element);//parentに要素として追加
640
-
641
- }
642
-
643
- }
644
-
645
- }
646
-
647
- // 比較するp要素を取得
648
-
649
- var parent = document.getElementById('parent');
650
-
651
- var child = parent.getElementsByTagName('p');
652
-
653
- // p要素のinnerTextだけの配列を作る
654
-
655
- var textArray = [];
656
-
657
- for (var i = 0, len = child.length; i < len; ++i) {
658
-
659
- textArray[i] = child[i].innerText;
660
-
661
- }
662
-
663
-
664
-
665
- })();
666
-
667
- </script>
668
-
669
- </body>
670
-
671
- ```
672
-
673
- ---
674
-
675
-
676
-
677
- 【2018/12/09の修正 ① ② に関する質問】
678
-
679
- ●どちらもinputにテキスト(例えば「りんご」など)を入れても全く動作しないのですが、
680
-
681
- どうすれば良いでしょうか?
682
-
683
-
684
-
685
- ---
686
-
687
-
688
-
689
- 【参考にさせていただいたサイト】
690
-
691
- ・リアルタイムで入力した文字を取得する方法
692
-
693
- http://ysaam.sakura.ne.jp/dic.cgi?dic=1000077
694
-
695
- ・検索方法
696
-
697
- https://www.sejuku.net/blog/21049
25
+ [CodePen](https://codepen.io/0166_0166/pen/qLVpKe)
698
-
699
-
700
-
701
- ---
702
26
 
703
27
 
704
28
 

5

アドバイスをコードに反映

2018/12/31 12:47

投稿

_sz
_sz

スコア21

test CHANGED
File without changes
test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  ---
18
18
 
19
- 前回のコード】(2018/09/24)
19
+ 【2018/09/24のコード】
20
20
 
21
21
  ```html
22
22
 
@@ -206,7 +206,7 @@
206
206
 
207
207
  ---
208
208
 
209
- いただいたアドバイスを踏まえたコード】(2018/12/01)
209
+ 【2018/12/01のコード】
210
210
 
211
211
 
212
212
 
@@ -422,6 +422,268 @@
422
422
 
423
423
  ---
424
424
 
425
+ ☆最新☆【いただいたアドバイスを踏まえ、修正したコード】
426
+
427
+ **【修正①】(2018/12/09)**
428
+
429
+
430
+
431
+ ```HTML
432
+
433
+ <body>
434
+
435
+ <div id="container">
436
+
437
+
438
+
439
+ <form action="#">
440
+
441
+ <input type="text" id="inputText" placeholder="文字を入力してください">
442
+
443
+ <input type="button" value="検索">
444
+
445
+ </form>
446
+
447
+
448
+
449
+ <div id="parent">
450
+
451
+ <p>りんご</p>
452
+
453
+ <p>みかん</p>
454
+
455
+ <p>みかん</p>
456
+
457
+ <p>りんご</p>
458
+
459
+ <p>りんご</p>
460
+
461
+ <p>パイナップル</p>
462
+
463
+ </div>
464
+
465
+
466
+
467
+ </div>
468
+
469
+ <script>
470
+
471
+ (function () {
472
+
473
+
474
+
475
+ 'use strict';
476
+
477
+
478
+
479
+ // parentのテキストたちを取得
480
+
481
+ const parent = document.getElementById('parent');
482
+
483
+ const children = parent.children;
484
+
485
+ for (var i = 0; i < children.length; i++) {
486
+
487
+ children[i].dataset.value = children[i].textContent;
488
+
489
+ // console.log(children[i].dataset.value);
490
+
491
+ }
492
+
493
+
494
+
495
+
496
+
497
+ // inputに入力されたテキストをリアルタイムで取得
498
+
499
+ function addValue(e) {
500
+
501
+ var inputText = document.getElementById("inputText");
502
+
503
+ inputText.addEventListener('keyup', function () {
504
+
505
+ var s = inputText.value;
506
+
507
+ console.log(s);
508
+
509
+ }, false);
510
+
511
+ }
512
+
513
+
514
+
515
+
516
+
517
+ // inputに入力されたテキストのdata-value属性に設定された値を検索
518
+
519
+ function searchText(text) {
520
+
521
+ return document.querySelectorAll(`[data-value="${text}"]`);
522
+
523
+ }
524
+
525
+
526
+
527
+
528
+
529
+ function getList(e) {
530
+
531
+ const e = document.getElementById('inputText').addEventListener('input');
532
+
533
+ addValue();
534
+
535
+ const nodeList = searchText(e.target.value);
536
+
537
+
538
+
539
+ // inputに入力されたテキストと同じテキストを持つparent内のp要素をConsoleに表示
540
+
541
+ console.log(nodeList);
542
+
543
+ }
544
+
545
+
546
+
547
+ })();
548
+
549
+ </script>
550
+
551
+ </body>
552
+
553
+ ```
554
+
555
+ ---
556
+
557
+ **【修正②】(2018/12/09)**
558
+
559
+ ```HTML
560
+
561
+ <body>
562
+
563
+ <div id="container">
564
+
565
+
566
+
567
+ <form action="#">
568
+
569
+ <input type="text" id="inputText" placeholder="文字を入力してください">
570
+
571
+ <input type="button" value="検索">
572
+
573
+ </form>
574
+
575
+
576
+
577
+ <div id="parent">
578
+
579
+ <p>りんご</p>
580
+
581
+ <p>みかん</p>
582
+
583
+ <p>みかん</p>
584
+
585
+ <p>りんご</p>
586
+
587
+ <p>りんご</p>
588
+
589
+ <p>パイナップル</p>
590
+
591
+ </div>
592
+
593
+
594
+
595
+ </div>
596
+
597
+ <script>
598
+
599
+ (function () {
600
+
601
+
602
+
603
+ 'use strict';
604
+
605
+ function addValue() {
606
+
607
+ var idname = "inputText";
608
+
609
+ searchText = document.getElementById(idname).value;
610
+
611
+ // グローバルの配列 textArray から searchText と同じ文字列の場合のみ抽出して新たな配列 newArray に入れていく
612
+
613
+ var newArray = textArray.filter(function (value) {
614
+
615
+ return value === searchText;
616
+
617
+ });
618
+
619
+
620
+
621
+ if (newArray.length != 0) {//newArrayに中身があった場合の処理
622
+
623
+ //いったん parentの中身を全て消す処理
624
+
625
+ while (parent.firstChild) {//parentのfirstChildが存在すれば
626
+
627
+ parent.removeChild(parent.firstChild);//parentのfirstChildを消す
628
+
629
+ }
630
+
631
+ //newArrayの中身の数だけ繰り返しながら 新しく p要素を追加
632
+
633
+ for (var i = 0, len = newArray.length; i < len; ++i) {
634
+
635
+ var element = document.createElement('p');// 新しいp要素を作る
636
+
637
+ element.innerText = newArray[i];//新しいpにテキストを入れる
638
+
639
+ parent.appendChild(element);//parentに要素として追加
640
+
641
+ }
642
+
643
+ }
644
+
645
+ }
646
+
647
+ // 比較するp要素を取得
648
+
649
+ var parent = document.getElementById('parent');
650
+
651
+ var child = parent.getElementsByTagName('p');
652
+
653
+ // p要素のinnerTextだけの配列を作る
654
+
655
+ var textArray = [];
656
+
657
+ for (var i = 0, len = child.length; i < len; ++i) {
658
+
659
+ textArray[i] = child[i].innerText;
660
+
661
+ }
662
+
663
+
664
+
665
+ })();
666
+
667
+ </script>
668
+
669
+ </body>
670
+
671
+ ```
672
+
673
+ ---
674
+
675
+
676
+
677
+ 【2018/12/09の修正 ① ② に関する質問】
678
+
679
+ ●どちらもinputにテキスト(例えば「りんご」など)を入れても全く動作しないのですが、
680
+
681
+ どうすれば良いでしょうか?
682
+
683
+
684
+
685
+ ---
686
+
425
687
 
426
688
 
427
689
  【参考にさせていただいたサイト】

4

テキスト追加

2018/12/09 09:47

投稿

_sz
_sz

スコア21

test CHANGED
File without changes
test CHANGED
@@ -4,6 +4,16 @@
4
4
 
5
5
 
6
6
 
7
+ 例えば、「りんご」とinputに打つと、
8
+
9
+ 表示されていた「みかん」や「パイナップル」は消え、
10
+
11
+ 「りんご」だけが表示されている状態になる
12
+
13
+ といった感じです。
14
+
15
+
16
+
7
17
  ---
8
18
 
9
19
  【前回のコード】(2018/09/24)

3

テキスト修正

2018/12/01 06:29

投稿

_sz
_sz

スコア21

test CHANGED
File without changes
test CHANGED
@@ -342,7 +342,9 @@
342
342
 
343
343
  ループでdata-value属性に自身のもつテキストノードの値を入れています。
344
344
 
345
- IE11でも動作させたかったのでfor文を用いましたが、「value」に関してエラーが出ておりJSが動かない状態です。どうすれば良いでしょうか?
345
+ IE11でも動作させたかったのでfor文を用いましたが、「value」に関してエラーが出ておりJSが動かない状態です。
346
+
347
+ どうすれば良いでしょうか?
346
348
 
347
349
 
348
350
 

2

いただいたアドバイスをコードに反映、それに対する質問

2018/12/01 06:26

投稿

_sz
_sz

スコア21

test CHANGED
@@ -1 +1 @@
1
- ページ内検索で、検索した文字列を含むp要素を表示したい
1
+ ページ内検索で、検索した文字列を含むp要素をネイティブJSで表示したい
test CHANGED
@@ -1,50 +1,12 @@
1
- JS初心者です。
2
-
3
- 根本的な間違いを犯しているかもしれませんが、温かい目で見ていただければ幸いです…
4
-
5
-
6
-
7
- **【実現したこと】**
1
+ 閲覧ありがとうござます。
8
-
2
+
9
- ページ内検索で、検索した文字を含むp要素のみを表示し、それ以外のp要素は非表示にしたいです。
3
+ ページ内検索で、検索した文字を含むp要素をネイティブJSで表示したいです。
10
-
11
- また、「検索」のボタンを押さずとも、入力した時点ですでに上記の状態となるようにしたいです。
4
+
12
-
13
- **※なるべくjQueryは使わず、ネイティブJSで作れると嬉しいです。**
5
+
14
-
15
-
16
-
17
- **【現状】**
6
+
18
-
19
- ●できていること
20
-
21
- ・検索のテキストボックスに入力された文字の取得
22
-
23
- ・p要素の取得
7
+ ---
24
-
25
-
26
-
27
- ●できていないこと
8
+
28
-
29
- ・p要素の文字列の取得(これができないと、入力された文字列との比較は不可能?)
30
-
31
- p要素の文字列を取得できそうに思える、.textContents と .innerHTML を試しましたが、どちらもundefindでした。他の方法も探したのですが、見つけることができませんでした。
32
-
33
-
34
-
35
- ・入力された文字列と、p要素の文字列の比較
36
-
37
- p要素の文字列が取得できていないので、この段階まで辿り着けていないのですが、search を使うと検索をして一致した位置を「数値」で返してくれるとのことなので、その数値を使ってp要素の表示/非表示を切り替えられるのではないかと考えています。
38
-
39
-
40
-
41
- ・該当p要素の表示と、それ以外のp要素の非表示
42
-
43
- display: block / none; でできるのではないかと考えています。
9
+ 【前回のコード】(2018/09/24)
44
-
45
-
46
-
47
-
48
10
 
49
11
  ```html
50
12
 
@@ -232,9 +194,225 @@
232
194
 
233
195
  ```
234
196
 
235
-
197
+ ---
198
+
236
-
199
+ 【いただいたアドバイスを踏まえたコード】(2018/12/01)
200
+
201
+
202
+
203
+ ```HTML
204
+
205
+ <body>
206
+
207
+ <div id="container">
208
+
209
+
210
+
211
+ <form action="#">
212
+
213
+ <input type="text" id="inputText" placeholder="文字を入力してください">
214
+
215
+ <input type="button" value="検索">
216
+
217
+ </form>
218
+
219
+
220
+
221
+ <div id="inputTextPv" class="inputTextPv"></div>
222
+
223
+
224
+
225
+ <div id="parent">
226
+
227
+ <p>りんご</p>
228
+
229
+ <p>みかん</p>
230
+
231
+ <p>みかん</p>
232
+
233
+ <p>りんご</p>
234
+
235
+ <p>りんご</p>
236
+
237
+ <p>パイナップル</p>
238
+
239
+ </div>
240
+
241
+
242
+
243
+ </div>
244
+
245
+ <script>
246
+
247
+ (function () {
248
+
249
+
250
+
251
+
252
+
253
+ // parentのテキストたちを取得
254
+
255
+ const parent = document.getElementById('parent');
256
+
257
+ const children = parent.children;
258
+
259
+ for (var child = 0; child < children.length; child++) {
260
+
261
+ // console.log(children[ child ].textContent);
262
+
263
+ child.dataset.value = children[ child ].textContent;
264
+
265
+ }
266
+
267
+
268
+
269
+
270
+
271
+ // inputに入力されたテキストをリアルタイムで取得
272
+
273
+ function addValue(e) {
274
+
275
+ var inputText = document.getElementById("inputText");
276
+
277
+ inputText.addEventListener('keyup', function () {
278
+
279
+ var s = inputText.value;
280
+
281
+ document.getElementById("inputTextPv").textContent = s;
282
+
283
+ }, false);
284
+
285
+ }
286
+
287
+
288
+
289
+
290
+
291
+ // inputに入力されたテキストのdata-value属性に設定された値を検索
292
+
293
+ function searchText(text) {
294
+
295
+ return document.querySelectorAll(`[data-value="${text}"]`);
296
+
297
+ }
298
+
299
+
300
+
301
+
302
+
303
+ function getList() {
304
+
305
+ const e = document.getElementById('inputText').addEventListener('input');
306
+
307
+ addValue();
308
+
309
+ const nodeList = searchText(e.target.value);
310
+
311
+ // inputに入力されたテキストと同じテキストを持つparent内のp要素をConsoleに表示
312
+
313
+ console.log(nodeList);
314
+
315
+ }
316
+
317
+
318
+
319
+
320
+
321
+ })();
322
+
323
+
324
+
325
+ </script>
326
+
327
+ </body>
328
+
329
+
330
+
331
+
332
+
333
+ ```
334
+
335
+ ---
336
+
337
+ 【2018/12/01の修正に関する質問】
338
+
339
+
340
+
341
+ **●parentのテキストたちを取得 について**
342
+
343
+ ループでdata-value属性に自身のもつテキストノードの値を入れています。
344
+
345
+ IE11でも動作させたかったのでfor文を用いましたが、「value」に関してエラーが出ておりJSが動かない状態です。どうすれば良いでしょうか?
346
+
347
+
348
+
349
+ エラー文:Uncaught TypeError: Cannot set property 'value' of undefined
350
+
351
+
352
+
353
+ **●searchText について**
354
+
355
+ ```HTML
356
+
357
+ function searchText(text) {
358
+
359
+ ```
360
+
361
+ とありますが、この(text)は何を示しているのでしょうか?
362
+
363
+ この()は宣言した変数を入れる場所であると思っていたのですが、宣言していない何かも入れることが可能なのでしょうか?
364
+
365
+
366
+
367
+ また、
368
+
369
+ ```HTML
370
+
371
+ return document.querySelectorAll(`[data-value="${text}"]`);
372
+
373
+ ```
374
+
375
+ の箇所でテンプレートリテラルを使用しておりますが、
376
+
377
+ このテンプレートリテラルを用いたdata-value属性を表す書き方を調べても、
378
+
379
+ 同じ書き方が見つかりませんでした。
380
+
381
+ 何かこのようなdata-value属性の書き方の、名称などはありますでしょうか?
382
+
383
+
384
+
385
+
386
+
387
+ **●getList について**
388
+
389
+ いただきましたアドバイスでは、アロー関数を使用されていましたが
390
+
391
+ よく分からなかったのでアロー関数ではない普通の書き方?にしてみました。
392
+
393
+ 正しく書き換えられていますでしょうか?
394
+
395
+
396
+
397
+ **●最後の行「 })();」 について**
398
+
399
+ この行も、前述した「value」に関してのエラーの対象行のようです。
400
+
401
+ 「JavaScriptは全体を即時関数で囲いつつ、
402
+
403
+ use strictキーワードで厳密なエラーチェックをすることが推奨されている。」
404
+
405
+ と知ったので、それも盛り込もうとしていますが、そのせいでしょうか?
406
+
407
+ こちらのエラーを解消するにはどうすれば良いでしょうか?
408
+
409
+
410
+
411
+ ---
412
+
413
+
414
+
237
- **【参考にさせていただいたサイト】**
415
+ 【参考にさせていただいたサイト】
238
416
 
239
417
  ・リアルタイムで入力した文字を取得する方法
240
418
 
@@ -246,6 +424,8 @@
246
424
 
247
425
 
248
426
 
427
+ ---
428
+
249
429
 
250
430
 
251
431
  以上になります。

1

修正

2018/12/01 06:23

投稿

_sz
_sz

スコア21

test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  また、「検索」のボタンを押さずとも、入力した時点ですでに上記の状態となるようにしたいです。
12
12
 
13
- **※なるべくjQueryは使わず、ネイティブJSで作りたいです…!**
13
+ **※なるべくjQueryは使わず、ネイティブJSで作れると嬉しいです**
14
14
 
15
15
 
16
16
 
@@ -28,7 +28,7 @@
28
28
 
29
29
  ・p要素の文字列の取得(これができないと、入力された文字列との比較は不可能?)
30
30
 
31
- p要素の文字列を取得できそうに思える、.textContents と .innerHTML を試しましたが、どちらもundefindでした。
31
+ p要素の文字列を取得できそうに思える、.textContents と .innerHTML を試しましたが、どちらもundefindでした。他の方法も探したのですが、見つけることができませんでした。
32
32
 
33
33
 
34
34