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

回答編集履歴

1

捨てよ jQuery

2021/02/28 11:17

投稿

babu_babu_baboo
babu_babu_baboo

スコア616

answer CHANGED
@@ -27,4 +27,42 @@
27
27
 
28
28
 
29
29
  ```
30
- こんなことをするくらいなら、最初から5個程度フォームを準備して必要な分だけ表示するほうが良いのだと作ってから思いました。
30
+ こんなことをするくらいなら、最初から5個程度フォームを準備して必要な分だけ表示するほうが良いのだと作ってから思いました。
31
+
32
+ --
33
+ 追記
34
+ jQuery を意地でも使いたい人と、意地になって使わない人との掛け合いね。
35
+ changeイベントを張り付けてからだと、新規挿入分は無視されているかな。
36
+ ルートから監視すれば取得できますよ。
37
+
38
+ ```js
39
+ document.getElementById('add_btn').addEventListener ('click', ()=> {
40
+ let
41
+ parent = document.querySelector ('.items'),
42
+ childs = parent.querySelectorAll ('.item'),
43
+ len = childs.length,
44
+ item = childs[0].cloneNode (true),
45
+ a = [...item.querySelectorAll ('*[for]')],
46
+ b = [...item.querySelectorAll ('*[name]')],
47
+ c = [...item.querySelectorAll ('*[id]')],
48
+ f = item.querySelector ('input[type="file"]'),
49
+ reg0 = /^.+[\d+]$/,
50
+ reg1 = /[\d+]$/,
51
+ str = `[${len}]`;
52
+
53
+ a.forEach (a=> reg0.test (a.getAttribute('for')) && a.setAttribute ('for', a.getAttribute('for').replace (reg1, str)));
54
+ b.forEach (a=> reg0.test (a.name) && a.setAttribute ('name', a.name.replace (reg1, str)));
55
+ c.forEach (a=> reg0.test (a.id) && a.setAttribute ('id', a.id.replace (reg1, str)));
56
+ f.value = '';
57
+ parent.appendChild (item);
58
+ }, false);
59
+
60
+
61
+ //ルートから取得
62
+ document.addEventListener ('change', event=> {
63
+ let fs = document.querySelectorAll ('input[type="file"]');
64
+ let vals = [...fs].map (f=> f.value).join (", ");
65
+ console.log(vals);
66
+ });
67
+
68
+ ```