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

質問編集履歴

10

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

2019/01/03 14:24

投稿

_sz
_sz

スコア22

title CHANGED
File without changes
body CHANGED
@@ -22,4 +22,197 @@
22
22
  [CodePen](https://codepen.io/0166/pen/pqdYXe)
23
23
 
24
24
  参考サイト
25
- [javascriptで文字列内に任意の文字列が含まれているかをtrue/falseで返す](https://qiita.com/yuskamiya/items/14f0ffdd459419721a52)
25
+ [javascriptで文字列内に任意の文字列が含まれているかをtrue/falseで返す](https://qiita.com/yuskamiya/items/14f0ffdd459419721a52)
26
+
27
+
28
+ ▼▼▼以下は、過去のコードと質問です▼▼▼
29
+
30
+ 【2018/09/24のコード】
31
+ ```html
32
+ <body>
33
+ <div id="container">
34
+ [String.indexOfメソッド](https://algorithm.joho.info/programming/javascript/string-partial-match-js/)で文字列の部分一致を判定しようとしていますが、
35
+ その箇所が上手くいっていません。
36
+ <form action="#">
37
+ <input type="text" id="inputText" placeholder="文字を入力してください" onkeyup="addValue()">
38
+ <input type="button" value="検索">
39
+ </form>
40
+ <div id="inputTextPv"></div>
41
+ <div id="parent">
42
+ <p>りんご</p>
43
+ <p>みかん</p>
44
+ <p>みかん</p>
45
+ <p>りんご</p>
46
+ <p>りんご</p>
47
+ <p>パイナップル</p>
48
+ </div>
49
+ </div>
50
+ <script>
51
+ // リアルタイムで入力された文字列を取得
52
+ function addValue(){
53
+ var idname = "inputText";
54
+ s = document.getElementById(idname).value;
55
+ var pvname = idname + "Pv";
56
+ document.getElementById(pvname).innerHTML = s;
57
+ }
58
+ // 比較するp要素を取得
59
+ var parent = document.getElementById('parent');
60
+ var child = parent.children;
61
+ console.log(child);
62
+ // 比較するp要素の文字列を取得 ※できない
63
+ console.log(child.textContents); //undefind
64
+ console.log(child.innerHTML); //undefind
65
+ // 入力された文字列とp要素の文字列を比較する ※できない
66
+ var result = child.search(search);
67
+ console.log(result);
68
+ </script>
69
+ </body>
70
+ ```
71
+ ```CSS
72
+ /* container */
73
+ #container {
74
+ width: 520px;
75
+ margin: 100px auto;
76
+ }
77
+ /* form */
78
+ form {
79
+ font-size: 0;
80
+ }
81
+ input {
82
+ font-size: 1.4rem;
83
+ appearance: none;
84
+ height: 48px;
85
+ }
86
+ input:focus {
87
+ outline: none;
88
+ }
89
+ input[type="text"] {
90
+ width: 400px;
91
+ padding: 0 10px;
92
+ }
93
+ input[type="submit"] {
94
+ width: 80px;
95
+ border: none;
96
+ }
97
+ input[type="submit"]:hover {
98
+ opacity: 0.5;
99
+ }
100
+ /* リアルタイムで入力された文字を表示してみるエリア */
101
+ #inputTextPv {
102
+ border: 1px solid red;
103
+ height: 48px;
104
+ line-height: 48px;
105
+ padding: 0 10px;
106
+ }
107
+ /* p要素のエリア */
108
+ #parent {
109
+ border: 1px solid blue;
110
+ padding: 0 10px;
111
+ }
112
+ ```
113
+ 【2018/09/24の修正に関する質問】
114
+
115
+ **【実現したいこと】**
116
+ ページ内検索で、検索した文字を含むp要素のみを表示し、それ以外のp要素は非表示にしたいです。
117
+ また、「検索」のボタンを押さずとも、入力した時点ですでに上記の状態となるようにしたいです。
118
+ **※なるべくjQueryは使わず、ネイティブJSで作れると嬉しいです。**
119
+ **【現状】**
120
+ ●できていること
121
+ ・検索のテキストボックスに入力された文字の取得
122
+ ・p要素の取得
123
+ ●できていないこと
124
+ ・p要素の文字列の取得(これができないと、入力された文字列との比較は不可能?)
125
+ p要素の文字列を取得できそうに思える、.textContents と .innerHTML を試しましたが、どちらもundefindでした。他の方法も探したのですが、見つけることができませんでした。
126
+ ・入力された文字列と、p要素の文字列の比較
127
+ p要素の文字列が取得できていないので、この段階まで辿り着けていないのですが、search を使うと検索をして一致した位置を「数値」で返してくれるとのことなので、その数値を使ってp要素の表示/非表示を切り替えられるのではないかと考えています。
128
+ ・該当p要素の表示と、それ以外のp要素の非表示
129
+ display: block / none; でできるのではないかと考えています。
130
+
131
+ ---
132
+ 【2018/12/01のコード】
133
+ ```HTML
134
+ <body>
135
+ <div id="container">
136
+
137
+ <form action="#">
138
+ <input type="text" id="inputText" placeholder="文字を入力してください">
139
+ <input type="button" value="検索">
140
+ </form>
141
+ <div id="inputTextPv" class="inputTextPv"></div>
142
+
143
+ <div id="parent">
144
+ <p>りんご</p>
145
+ <p>みかん</p>
146
+ <p>みかん</p>
147
+ <p>りんご</p>
148
+ <p>りんご</p>
149
+ <p>パイナップル</p>
150
+ </div>
151
+
152
+ </div>
153
+ <script>
154
+ (function () {
155
+ // parentのテキストたちを取得
156
+ const parent = document.getElementById('parent');
157
+ const children = parent.children;
158
+ for (var child = 0; child < children.length; child++) {
159
+ // console.log(children[ child ].textContent);
160
+ child.dataset.value = children[ child ].textContent;
161
+ }
162
+ // inputに入力されたテキストをリアルタイムで取得
163
+ function addValue(e) {
164
+ var inputText = document.getElementById("inputText");
165
+ inputText.addEventListener('keyup', function () {
166
+ var s = inputText.value;
167
+ document.getElementById("inputTextPv").textContent = s;
168
+ }, false);
169
+ }
170
+ // inputに入力されたテキストのdata-value属性に設定された値を検索
171
+ function searchText(text) {
172
+ return document.querySelectorAll(`[data-value="${text}"]`);
173
+ }
174
+ function getList() {
175
+ const e = document.getElementById('inputText').addEventListener('input');
176
+ addValue();
177
+ const nodeList = searchText(e.target.value);
178
+ // inputに入力されたテキストと同じテキストを持つparent内のp要素をConsoleに表示
179
+ console.log(nodeList);
180
+ }
181
+ })();
182
+ </script>
183
+ </body>
184
+ ```
185
+ 【2018/12/01の修正に関する質問】
186
+
187
+ **●parentのテキストたちを取得 について**
188
+ ループでdata-value属性に自身のもつテキストノードの値を入れています。
189
+ IE11でも動作させたかったのでfor文を用いましたが、「value」に関してエラーが出ておりJSが動かない状態です。
190
+ どうすれば良いでしょうか?
191
+ エラー文:Uncaught TypeError: Cannot set property 'value' of undefined
192
+
193
+ **●searchText について**
194
+ ```HTML
195
+ function searchText(text) {
196
+ ```
197
+ とありますが、この(text)は何を示しているのでしょうか?
198
+ この()は宣言した変数を入れる場所であると思っていたのですが、宣言していない何かも入れることが可能なのでしょうか?
199
+ また、
200
+ ```HTML
201
+ return document.querySelectorAll(`[data-value="${text}"]`);
202
+ ```
203
+ の箇所でテンプレートリテラルを使用しておりますが、
204
+ このテンプレートリテラルを用いたdata-value属性を表す書き方を調べても、
205
+ 同じ書き方が見つかりませんでした。
206
+ 何かこのようなdata-value属性の書き方の、名称などはありますでしょうか?
207
+
208
+ **●getList について**
209
+ いただきましたアドバイスでは、アロー関数を使用されていましたが
210
+ よく分からなかったのでアロー関数ではない普通の書き方?にしてみました。
211
+ 正しく書き換えられていますでしょうか?
212
+
213
+ **●最後の行「 })();」 について**
214
+ この行も、前述した「value」に関してのエラーの対象行のようです。
215
+ 「JavaScriptは全体を即時関数で囲いつつ、
216
+ use strictキーワードで厳密なエラーチェックをすることが推奨されている。」
217
+ と知ったので、それも盛り込もうとしていますが、そのせいでしょうか?
218
+ こちらのエラーを解消するにはどうすれば良いでしょうか?

9

タイトル修正

2019/01/03 14:24

投稿

_sz
_sz

スコア22

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

8

質問の更新

2019/01/03 14:17

投稿

_sz
_sz

スコア22

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

7

タイトル修正

2019/01/01 13:51

投稿

_sz
_sz

スコア22

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

6

質問更新

2018/12/31 12:57

投稿

_sz
_sz

スコア22

title CHANGED
@@ -1,1 +1,1 @@
1
- ページ内検索で、検索し文字列を含むp要素をネイティブJSで表示したい
1
+ inputに入力されテキストと一致しないp要素を表示にする方法
body CHANGED
@@ -1,354 +1,16 @@
1
1
  閲覧ありがとうございます。
2
- ページ内検索で、検索し文字列を含むp要素をネイティブJSで表示したいです。
2
+ inputに入力されテキストと一致しないp要素を表示したいです。
3
3
 
4
+ 「りんご」「りんごかな」「みかん」「パイナップル」といったp要素があり、
4
- 例えば、「りんご」とinputに打つと
5
+ inputに「りんご」と入力された場合
6
+ 完全に一致、もしくは部分一致の「りんご」「りんごかな」は表示したままに、
5
- 表示さていた「みかん」「パイナップル」は消え
7
+ 以外の「みかん」「パイナップル」は、クラスhiddenを付け非表示にさせたいです。
6
- 「りんご」だけが表示されている状態になる
7
- といった感じです。
8
8
 
9
- ---
10
- 【2018/09/24コード】
9
+ [String.indexOfメソッド](https://algorithm.joho.info/programming/javascript/string-partial-match-js/)で文字列部分一致を判定しようとしていますが、
11
- ```html
12
- <body>
10
+ その箇所が上手くいっていません。
13
- <div id="container">
14
11
 
15
- <form action="#">
12
+ ▼コード
16
- <input type="text" id="inputText" placeholder="文字を入力してください" onkeyup="addValue()">
17
- <input type="button" value="検索">
13
+ [CodePen](https://codepen.io/0166_0166/pen/qLVpKe)
18
- </form>
19
14
 
20
- <div id="inputTextPv"></div>
21
-
22
- <div id="parent">
23
- <p>りんご</p>
24
- <p>みかん</p>
25
- <p>みかん</p>
26
- <p>りんご</p>
27
- <p>りんご</p>
28
- <p>パイナップル</p>
29
- </div>
30
-
31
- </div>
32
-
33
- <script>
34
- // リアルタイムで入力された文字列を取得
35
- function addValue(){
36
- var idname = "inputText";
37
- s = document.getElementById(idname).value;
38
- var pvname = idname + "Pv";
39
- document.getElementById(pvname).innerHTML = s;
40
- }
41
-
42
- // 比較するp要素を取得
43
- var parent = document.getElementById('parent');
44
- var child = parent.children;
45
- console.log(child);
46
-
47
- // 比較するp要素の文字列を取得 ※できない
48
- console.log(child.textContents); //undefind
49
- console.log(child.innerHTML); //undefind
50
-
51
- // 入力された文字列とp要素の文字列を比較する ※できない
52
- var result = child.search(search);
53
- console.log(result);
54
-
55
- </script>
56
- </body>
57
-
58
- ```
59
- ```CSS
60
- /* container */
61
- #container {
62
- width: 520px;
63
- margin: 100px auto;
64
- }
65
-
66
- /* form */
67
- form {
68
- font-size: 0;
69
- }
70
- input {
71
- font-size: 1.4rem;
72
- appearance: none;
73
- height: 48px;
74
- }
75
- input:focus {
76
- outline: none;
77
- }
78
- input[type="text"] {
79
- width: 400px;
80
- padding: 0 10px;
81
- }
82
- input[type="submit"] {
83
- width: 80px;
84
- border: none;
85
- }
86
- input[type="submit"]:hover {
87
- opacity: 0.5;
88
- }
89
-
90
- /* リアルタイムで入力された文字を表示してみるエリア */
91
- #inputTextPv {
92
- border: 1px solid red;
93
- height: 48px;
94
- line-height: 48px;
95
- padding: 0 10px;
96
- }
97
-
98
- /* p要素のエリア */
99
- #parent {
100
- border: 1px solid blue;
101
- padding: 0 10px;
102
- }
103
- ```
104
- ---
105
- 【2018/12/01のコード】
106
-
107
- ```HTML
108
- <body>
109
- <div id="container">
110
-
111
- <form action="#">
112
- <input type="text" id="inputText" placeholder="文字を入力してください">
113
- <input type="button" value="検索">
114
- </form>
115
-
116
- <div id="inputTextPv" class="inputTextPv"></div>
117
-
118
- <div id="parent">
119
- <p>りんご</p>
120
- <p>みかん</p>
121
- <p>みかん</p>
122
- <p>りんご</p>
123
- <p>りんご</p>
124
- <p>パイナップル</p>
125
- </div>
126
-
127
- </div>
128
- <script>
129
- (function () {
130
-
131
-
132
- // parentのテキストたちを取得
133
- const parent = document.getElementById('parent');
134
- const children = parent.children;
135
- for (var child = 0; child < children.length; child++) {
136
- // console.log(children[ child ].textContent);
137
- child.dataset.value = children[ child ].textContent;
138
- }
139
-
140
-
141
- // inputに入力されたテキストをリアルタイムで取得
142
- function addValue(e) {
143
- var inputText = document.getElementById("inputText");
144
- inputText.addEventListener('keyup', function () {
145
- var s = inputText.value;
146
- document.getElementById("inputTextPv").textContent = s;
147
- }, false);
148
- }
149
-
150
-
151
- // inputに入力されたテキストのdata-value属性に設定された値を検索
152
- function searchText(text) {
153
- return document.querySelectorAll(`[data-value="${text}"]`);
154
- }
155
-
156
-
157
- function getList() {
158
- const e = document.getElementById('inputText').addEventListener('input');
159
- addValue();
160
- const nodeList = searchText(e.target.value);
161
- // inputに入力されたテキストと同じテキストを持つparent内のp要素をConsoleに表示
162
- console.log(nodeList);
163
- }
164
-
165
-
166
- })();
167
-
168
- </script>
169
- </body>
170
-
171
-
172
- ```
173
- ---
174
- 【2018/12/01の修正に関する質問】
175
-
176
- **●parentのテキストたちを取得 について**
177
- ループでdata-value属性に自身のもつテキストノードの値を入れています。
178
- IE11でも動作させたかったのでfor文を用いましたが、「value」に関してエラーが出ておりJSが動かない状態です。
179
- どうすれば良いでしょうか?
180
-
181
- エラー文:Uncaught TypeError: Cannot set property 'value' of undefined
182
-
183
- **●searchText について**
184
- ```HTML
185
- function searchText(text) {
186
- ```
187
- とありますが、この(text)は何を示しているのでしょうか?
188
- この()は宣言した変数を入れる場所であると思っていたのですが、宣言していない何かも入れることが可能なのでしょうか?
189
-
190
- また、
191
- ```HTML
192
- return document.querySelectorAll(`[data-value="${text}"]`);
193
- ```
194
- の箇所でテンプレートリテラルを使用しておりますが、
195
- このテンプレートリテラルを用いたdata-value属性を表す書き方を調べても、
196
- 同じ書き方が見つかりませんでした。
197
- 何かこのようなdata-value属性の書き方の、名称などはありますでしょうか?
198
-
199
-
200
- **●getList について**
201
- いただきましたアドバイスでは、アロー関数を使用されていましたが
202
- よく分からなかったのでアロー関数ではない普通の書き方?にしてみました。
203
- 正しく書き換えられていますでしょうか?
204
-
205
- **●最後の行「 })();」 について**
206
- この行も、前述した「value」に関してのエラーの対象行のようです。
207
- 「JavaScriptは全体を即時関数で囲いつつ、
208
- use strictキーワードで厳密なエラーチェックをすることが推奨されている。」
209
- と知ったので、それも盛り込もうとしていますが、そのせいでしょうか?
210
- こちらのエラーを解消するにはどうすれば良いでしょうか?
211
-
212
- ---
213
- ☆最新☆【いただいたアドバイスを踏まえ、修正したコード】
214
- **【修正①】(2018/12/09)**
215
-
216
- ```HTML
217
- <body>
218
- <div id="container">
219
-
220
- <form action="#">
221
- <input type="text" id="inputText" placeholder="文字を入力してください">
222
- <input type="button" value="検索">
223
- </form>
224
-
225
- <div id="parent">
226
- <p>りんご</p>
227
- <p>みかん</p>
228
- <p>みかん</p>
229
- <p>りんご</p>
230
- <p>りんご</p>
231
- <p>パイナップル</p>
232
- </div>
233
-
234
- </div>
235
- <script>
236
- (function () {
237
-
238
- 'use strict';
239
-
240
- // parentのテキストたちを取得
241
- const parent = document.getElementById('parent');
242
- const children = parent.children;
243
- for (var i = 0; i < children.length; i++) {
244
- children[i].dataset.value = children[i].textContent;
245
- // console.log(children[i].dataset.value);
246
- }
247
-
248
-
249
- // inputに入力されたテキストをリアルタイムで取得
250
- function addValue(e) {
251
- var inputText = document.getElementById("inputText");
252
- inputText.addEventListener('keyup', function () {
253
- var s = inputText.value;
254
- console.log(s);
255
- }, false);
256
- }
257
-
258
-
259
- // inputに入力されたテキストのdata-value属性に設定された値を検索
260
- function searchText(text) {
261
- return document.querySelectorAll(`[data-value="${text}"]`);
262
- }
263
-
264
-
265
- function getList(e) {
266
- const e = document.getElementById('inputText').addEventListener('input');
267
- addValue();
268
- const nodeList = searchText(e.target.value);
269
-
270
- // inputに入力されたテキストと同じテキストを持つparent内のp要素をConsoleに表示
271
- console.log(nodeList);
272
- }
273
-
274
- })();
275
- </script>
276
- </body>
277
- ```
278
- ---
279
- **【修正②】(2018/12/09)**
280
- ```HTML
281
- <body>
282
- <div id="container">
283
-
284
- <form action="#">
285
- <input type="text" id="inputText" placeholder="文字を入力してください">
286
- <input type="button" value="検索">
287
- </form>
288
-
289
- <div id="parent">
290
- <p>りんご</p>
291
- <p>みかん</p>
292
- <p>みかん</p>
293
- <p>りんご</p>
294
- <p>りんご</p>
295
- <p>パイナップル</p>
296
- </div>
297
-
298
- </div>
299
- <script>
300
- (function () {
301
-
302
- 'use strict';
303
- function addValue() {
304
- var idname = "inputText";
305
- searchText = document.getElementById(idname).value;
306
- // グローバルの配列 textArray から searchText と同じ文字列の場合のみ抽出して新たな配列 newArray に入れていく
307
- var newArray = textArray.filter(function (value) {
308
- return value === searchText;
309
- });
310
-
311
- if (newArray.length != 0) {//newArrayに中身があった場合の処理
312
- //いったん parentの中身を全て消す処理
313
- while (parent.firstChild) {//parentのfirstChildが存在すれば
314
- parent.removeChild(parent.firstChild);//parentのfirstChildを消す
315
- }
316
- //newArrayの中身の数だけ繰り返しながら 新しく p要素を追加
317
- for (var i = 0, len = newArray.length; i < len; ++i) {
318
- var element = document.createElement('p');// 新しいp要素を作る
319
- element.innerText = newArray[i];//新しいpにテキストを入れる
320
- parent.appendChild(element);//parentに要素として追加
321
- }
322
- }
323
- }
324
- // 比較するp要素を取得
325
- var parent = document.getElementById('parent');
326
- var child = parent.getElementsByTagName('p');
327
- // p要素のinnerTextだけの配列を作る
328
- var textArray = [];
329
- for (var i = 0, len = child.length; i < len; ++i) {
330
- textArray[i] = child[i].innerText;
331
- }
332
-
333
- })();
334
- </script>
335
- </body>
336
- ```
337
- ---
338
-
339
- 【2018/12/09の修正 ① ② に関する質問】
340
- ●どちらもinputにテキスト(例えば「りんご」など)を入れても全く動作しないのですが、
341
- どうすれば良いでしょうか?
342
-
343
- ---
344
-
345
- 【参考にさせていただいたサイト】
346
- ・リアルタイムで入力した文字を取得する方法
347
- http://ysaam.sakura.ne.jp/dic.cgi?dic=1000077
348
- ・検索方法
349
- https://www.sejuku.net/blog/21049
350
-
351
- ---
352
-
353
15
  以上になります。
354
16
  恐れ入りますが、ご教授のほどよろしくお願いいたします。

5

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

2018/12/31 12:47

投稿

_sz
_sz

スコア22

title CHANGED
File without changes
body CHANGED
@@ -7,7 +7,7 @@
7
7
  といった感じです。
8
8
 
9
9
  ---
10
- 前回のコード】(2018/09/24)
10
+ 【2018/09/24のコード】
11
11
  ```html
12
12
  <body>
13
13
  <div id="container">
@@ -102,7 +102,7 @@
102
102
  }
103
103
  ```
104
104
  ---
105
- いただいたアドバイスを踏まえたコード】(2018/12/01)
105
+ 【2018/12/01のコード】
106
106
 
107
107
  ```HTML
108
108
  <body>
@@ -210,7 +210,138 @@
210
210
  こちらのエラーを解消するにはどうすれば良いでしょうか?
211
211
 
212
212
  ---
213
+ ☆最新☆【いただいたアドバイスを踏まえ、修正したコード】
214
+ **【修正①】(2018/12/09)**
213
215
 
216
+ ```HTML
217
+ <body>
218
+ <div id="container">
219
+
220
+ <form action="#">
221
+ <input type="text" id="inputText" placeholder="文字を入力してください">
222
+ <input type="button" value="検索">
223
+ </form>
224
+
225
+ <div id="parent">
226
+ <p>りんご</p>
227
+ <p>みかん</p>
228
+ <p>みかん</p>
229
+ <p>りんご</p>
230
+ <p>りんご</p>
231
+ <p>パイナップル</p>
232
+ </div>
233
+
234
+ </div>
235
+ <script>
236
+ (function () {
237
+
238
+ 'use strict';
239
+
240
+ // parentのテキストたちを取得
241
+ const parent = document.getElementById('parent');
242
+ const children = parent.children;
243
+ for (var i = 0; i < children.length; i++) {
244
+ children[i].dataset.value = children[i].textContent;
245
+ // console.log(children[i].dataset.value);
246
+ }
247
+
248
+
249
+ // inputに入力されたテキストをリアルタイムで取得
250
+ function addValue(e) {
251
+ var inputText = document.getElementById("inputText");
252
+ inputText.addEventListener('keyup', function () {
253
+ var s = inputText.value;
254
+ console.log(s);
255
+ }, false);
256
+ }
257
+
258
+
259
+ // inputに入力されたテキストのdata-value属性に設定された値を検索
260
+ function searchText(text) {
261
+ return document.querySelectorAll(`[data-value="${text}"]`);
262
+ }
263
+
264
+
265
+ function getList(e) {
266
+ const e = document.getElementById('inputText').addEventListener('input');
267
+ addValue();
268
+ const nodeList = searchText(e.target.value);
269
+
270
+ // inputに入力されたテキストと同じテキストを持つparent内のp要素をConsoleに表示
271
+ console.log(nodeList);
272
+ }
273
+
274
+ })();
275
+ </script>
276
+ </body>
277
+ ```
278
+ ---
279
+ **【修正②】(2018/12/09)**
280
+ ```HTML
281
+ <body>
282
+ <div id="container">
283
+
284
+ <form action="#">
285
+ <input type="text" id="inputText" placeholder="文字を入力してください">
286
+ <input type="button" value="検索">
287
+ </form>
288
+
289
+ <div id="parent">
290
+ <p>りんご</p>
291
+ <p>みかん</p>
292
+ <p>みかん</p>
293
+ <p>りんご</p>
294
+ <p>りんご</p>
295
+ <p>パイナップル</p>
296
+ </div>
297
+
298
+ </div>
299
+ <script>
300
+ (function () {
301
+
302
+ 'use strict';
303
+ function addValue() {
304
+ var idname = "inputText";
305
+ searchText = document.getElementById(idname).value;
306
+ // グローバルの配列 textArray から searchText と同じ文字列の場合のみ抽出して新たな配列 newArray に入れていく
307
+ var newArray = textArray.filter(function (value) {
308
+ return value === searchText;
309
+ });
310
+
311
+ if (newArray.length != 0) {//newArrayに中身があった場合の処理
312
+ //いったん parentの中身を全て消す処理
313
+ while (parent.firstChild) {//parentのfirstChildが存在すれば
314
+ parent.removeChild(parent.firstChild);//parentのfirstChildを消す
315
+ }
316
+ //newArrayの中身の数だけ繰り返しながら 新しく p要素を追加
317
+ for (var i = 0, len = newArray.length; i < len; ++i) {
318
+ var element = document.createElement('p');// 新しいp要素を作る
319
+ element.innerText = newArray[i];//新しいpにテキストを入れる
320
+ parent.appendChild(element);//parentに要素として追加
321
+ }
322
+ }
323
+ }
324
+ // 比較するp要素を取得
325
+ var parent = document.getElementById('parent');
326
+ var child = parent.getElementsByTagName('p');
327
+ // p要素のinnerTextだけの配列を作る
328
+ var textArray = [];
329
+ for (var i = 0, len = child.length; i < len; ++i) {
330
+ textArray[i] = child[i].innerText;
331
+ }
332
+
333
+ })();
334
+ </script>
335
+ </body>
336
+ ```
337
+ ---
338
+
339
+ 【2018/12/09の修正 ① ② に関する質問】
340
+ ●どちらもinputにテキスト(例えば「りんご」など)を入れても全く動作しないのですが、
341
+ どうすれば良いでしょうか?
342
+
343
+ ---
344
+
214
345
  【参考にさせていただいたサイト】
215
346
  ・リアルタイムで入力した文字を取得する方法
216
347
  http://ysaam.sakura.ne.jp/dic.cgi?dic=1000077

4

テキスト追加

2018/12/09 09:47

投稿

_sz
_sz

スコア22

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,11 @@
1
1
  閲覧ありがとうございます。
2
2
  ページ内検索で、検索した文字列を含むp要素をネイティブJSで表示したいです。
3
3
 
4
+ 例えば、「りんご」とinputに打つと、
5
+ 表示されていた「みかん」や「パイナップル」は消え、
6
+ 「りんご」だけが表示されている状態になる
7
+ といった感じです。
8
+
4
9
  ---
5
10
  【前回のコード】(2018/09/24)
6
11
  ```html

3

テキスト修正

2018/12/01 06:29

投稿

_sz
_sz

スコア22

title CHANGED
File without changes
body CHANGED
@@ -170,7 +170,8 @@
170
170
 
171
171
  **●parentのテキストたちを取得 について**
172
172
  ループでdata-value属性に自身のもつテキストノードの値を入れています。
173
- IE11でも動作させたかったのでfor文を用いましたが、「value」に関してエラーが出ておりJSが動かない状態です。どうすれば良いでしょうか?
173
+ IE11でも動作させたかったのでfor文を用いましたが、「value」に関してエラーが出ておりJSが動かない状態です。
174
+ どうすれば良いでしょうか?
174
175
 
175
176
  エラー文:Uncaught TypeError: Cannot set property 'value' of undefined
176
177
 

2

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

2018/12/01 06:26

投稿

_sz
_sz

スコア22

title CHANGED
@@ -1,1 +1,1 @@
1
- ページ内検索で、検索した文字列を含むp要素を表示したい
1
+ ページ内検索で、検索した文字列を含むp要素をネイティブJSで表示したい
body CHANGED
@@ -1,27 +1,8 @@
1
- JS初心者です。
1
+ 閲覧ありがとうございます。
2
- 根本的な間違いを犯しているかもしれませんが温かい目見ていだければ幸いです
2
+ ページ内検索で検索した文字列を含むp要素をネイティブJS表示したいです
3
3
 
4
- **【実現したいこと】**
5
- ページ内検索で、検索した文字を含むp要素のみを表示し、それ以外のp要素は非表示にしたいです。
6
- また、「検索」のボタンを押さずとも、入力した時点ですでに上記の状態となるようにしたいです。
7
- **※なるべくjQueryは使わず、ネイティブJSで作れると嬉しいです。**
8
-
9
- **【現状】**
10
- ●できていること
11
- ・検索のテキストボックスに入力された文字の取得
12
- ・p要素の取得
4
+ ---
13
-
14
- ●できていないこと
15
- ・p要素の文字列の取得(これができないと、入力された文字列との比較は不可能?)
16
- p要素の文字列を取得できそうに思える、.textContents と .innerHTML を試しましたが、どちらもundefindでした。他の方法も探したのですが、見つけることができませんでした。
17
-
18
- ・入力された文字列と、p要素の文字列の比較
19
- p要素の文字列が取得できていないので、この段階まで辿り着けていないのですが、search を使うと検索をして一致した位置を「数値」で返してくれるとのことなので、その数値を使ってp要素の表示/非表示を切り替えられるのではないかと考えています。
20
-
21
- ・該当p要素の表示と、それ以外のp要素の非表示
22
- display: block / none; でできるではないかと考えています。
5
+ 【前回コード】(2018/09/24)
23
-
24
-
25
6
  ```html
26
7
  <body>
27
8
  <div id="container">
@@ -115,13 +96,122 @@
115
96
  padding: 0 10px;
116
97
  }
117
98
  ```
99
+ ---
100
+ 【いただいたアドバイスを踏まえたコード】(2018/12/01)
118
101
 
102
+ ```HTML
103
+ <body>
104
+ <div id="container">
105
+
106
+ <form action="#">
107
+ <input type="text" id="inputText" placeholder="文字を入力してください">
108
+ <input type="button" value="検索">
109
+ </form>
110
+
111
+ <div id="inputTextPv" class="inputTextPv"></div>
112
+
113
+ <div id="parent">
114
+ <p>りんご</p>
115
+ <p>みかん</p>
116
+ <p>みかん</p>
117
+ <p>りんご</p>
118
+ <p>りんご</p>
119
+ <p>パイナップル</p>
120
+ </div>
121
+
122
+ </div>
123
+ <script>
124
+ (function () {
125
+
126
+
127
+ // parentのテキストたちを取得
128
+ const parent = document.getElementById('parent');
129
+ const children = parent.children;
130
+ for (var child = 0; child < children.length; child++) {
131
+ // console.log(children[ child ].textContent);
132
+ child.dataset.value = children[ child ].textContent;
133
+ }
134
+
135
+
136
+ // inputに入力されたテキストをリアルタイムで取得
137
+ function addValue(e) {
138
+ var inputText = document.getElementById("inputText");
139
+ inputText.addEventListener('keyup', function () {
140
+ var s = inputText.value;
141
+ document.getElementById("inputTextPv").textContent = s;
142
+ }, false);
143
+ }
144
+
145
+
146
+ // inputに入力されたテキストのdata-value属性に設定された値を検索
147
+ function searchText(text) {
148
+ return document.querySelectorAll(`[data-value="${text}"]`);
149
+ }
150
+
151
+
152
+ function getList() {
153
+ const e = document.getElementById('inputText').addEventListener('input');
154
+ addValue();
155
+ const nodeList = searchText(e.target.value);
156
+ // inputに入力されたテキストと同じテキストを持つparent内のp要素をConsoleに表示
157
+ console.log(nodeList);
158
+ }
159
+
160
+
161
+ })();
162
+
163
+ </script>
164
+ </body>
165
+
166
+
167
+ ```
168
+ ---
169
+ 【2018/12/01の修正に関する質問】
170
+
171
+ **●parentのテキストたちを取得 について**
172
+ ループでdata-value属性に自身のもつテキストノードの値を入れています。
173
+ IE11でも動作させたかったのでfor文を用いましたが、「value」に関してエラーが出ておりJSが動かない状態です。どうすれば良いでしょうか?
174
+
175
+ エラー文:Uncaught TypeError: Cannot set property 'value' of undefined
176
+
177
+ **●searchText について**
178
+ ```HTML
179
+ function searchText(text) {
180
+ ```
181
+ とありますが、この(text)は何を示しているのでしょうか?
182
+ この()は宣言した変数を入れる場所であると思っていたのですが、宣言していない何かも入れることが可能なのでしょうか?
183
+
184
+ また、
185
+ ```HTML
186
+ return document.querySelectorAll(`[data-value="${text}"]`);
187
+ ```
188
+ の箇所でテンプレートリテラルを使用しておりますが、
189
+ このテンプレートリテラルを用いたdata-value属性を表す書き方を調べても、
190
+ 同じ書き方が見つかりませんでした。
191
+ 何かこのようなdata-value属性の書き方の、名称などはありますでしょうか?
192
+
193
+
194
+ **●getList について**
195
+ いただきましたアドバイスでは、アロー関数を使用されていましたが
196
+ よく分からなかったのでアロー関数ではない普通の書き方?にしてみました。
197
+ 正しく書き換えられていますでしょうか?
198
+
199
+ **●最後の行「 })();」 について**
200
+ この行も、前述した「value」に関してのエラーの対象行のようです。
201
+ 「JavaScriptは全体を即時関数で囲いつつ、
202
+ use strictキーワードで厳密なエラーチェックをすることが推奨されている。」
203
+ と知ったので、それも盛り込もうとしていますが、そのせいでしょうか?
204
+ こちらのエラーを解消するにはどうすれば良いでしょうか?
205
+
206
+ ---
207
+
119
- **【参考にさせていただいたサイト】**
208
+ 【参考にさせていただいたサイト】
120
209
  ・リアルタイムで入力した文字を取得する方法
121
210
  http://ysaam.sakura.ne.jp/dic.cgi?dic=1000077
122
211
  ・検索方法
123
212
  https://www.sejuku.net/blog/21049
124
213
 
214
+ ---
125
215
 
126
216
  以上になります。
127
217
  恐れ入りますが、ご教授のほどよろしくお願いいたします。

1

修正

2018/12/01 06:23

投稿

_sz
_sz

スコア22

title CHANGED
File without changes
body CHANGED
@@ -4,7 +4,7 @@
4
4
  **【実現したいこと】**
5
5
  ページ内検索で、検索した文字を含むp要素のみを表示し、それ以外のp要素は非表示にしたいです。
6
6
  また、「検索」のボタンを押さずとも、入力した時点ですでに上記の状態となるようにしたいです。
7
- **※なるべくjQueryは使わず、ネイティブJSで作りたいです…!**
7
+ **※なるべくjQueryは使わず、ネイティブJSで作れると嬉しいです**
8
8
 
9
9
  **【現状】**
10
10
  ●できていること
@@ -13,7 +13,7 @@
13
13
 
14
14
  ●できていないこと
15
15
  ・p要素の文字列の取得(これができないと、入力された文字列との比較は不可能?)
16
- p要素の文字列を取得できそうに思える、.textContents と .innerHTML を試しましたが、どちらもundefindでした。
16
+ p要素の文字列を取得できそうに思える、.textContents と .innerHTML を試しましたが、どちらもundefindでした。他の方法も探したのですが、見つけることができませんでした。
17
17
 
18
18
  ・入力された文字列と、p要素の文字列の比較
19
19
  p要素の文字列が取得できていないので、この段階まで辿り着けていないのですが、search を使うと検索をして一致した位置を「数値」で返してくれるとのことなので、その数値を使ってp要素の表示/非表示を切り替えられるのではないかと考えています。