回答編集履歴

1

JavaScriptコードの追記

2017/12/18 05:54

投稿

think49
think49

スコア18162

test CHANGED
@@ -1,3 +1,7 @@
1
+ ### 多次元配列
2
+
3
+
4
+
1
5
  > これが非常に厄介で例えばname="hoge[0][huga][1][]のようなフォームが沢山あります。
2
6
 
3
7
 
@@ -76,4 +80,194 @@
76
80
 
77
81
 
78
82
 
83
+ ### JavaScriptコード
84
+
85
+
86
+
87
+ > javascript側でのフォーム追加処理はこんな感じです。※jquery使ってます
88
+
89
+
90
+
91
+ HTMLが見えないのでどういう理屈でそのコードに至ったのかまで読み取れませんでしたが、私なら次のように書きます。
92
+
93
+
94
+
95
+ - [入力項目の多い画面の設計 - JSFiddle](https://jsfiddle.net/3u96y28n/)
96
+
97
+
98
+
99
+ ```HTML
100
+
101
+ <form>
102
+
103
+ <input class="insert-fieldset" type="button" value="追加">
104
+
105
+ <fieldset>
106
+
107
+ <legend>フォーム群1</legend>
108
+
109
+ <p><input type="text" name="table[0][text][0]"></p>
110
+
111
+ <p><input type="text" name="table[0][text][1]"></p>
112
+
113
+
114
+
115
+ <input class="insert-fieldset" type="button" value="追加">
116
+
117
+
118
+
119
+ <fieldset>
120
+
121
+ <legend>フォーム群1-1</legend>
122
+
123
+ <p><input type="text" name="table[0][group][0][0]"></p>
124
+
125
+ <p><input type="text" name="table[0][group][0][1]"></p>
126
+
127
+ </fieldset>
128
+
129
+
130
+
131
+ <fieldset>
132
+
133
+ <legend>フォーム群1-2</legend>
134
+
135
+ <p><input type="text" name="table[0][group][1][0]"></p>
136
+
137
+ <p><input type="text" name="table[0][group][1][1]"></p>
138
+
139
+ </fieldset>
140
+
141
+ </fieldset>
142
+
143
+
144
+
145
+ <fieldset>
146
+
147
+ <legend>フォーム群2</legend>
148
+
149
+ <p><input type="text" name="table[1][text][0]"></p>
150
+
151
+ <p><input type="text" name="table[1][text][1]"></p>
152
+
153
+
154
+
155
+ <input class="insert-fieldset" type="button" value="追加">
156
+
157
+
158
+
159
+ <fieldset>
160
+
161
+ <legend>フォーム群2-1</legend>
162
+
163
+ <p><input type="text" name="table[1][group][0][0]"></p>
164
+
165
+ <p><input type="text" name="table[1][group][0][1]"></p>
166
+
167
+ </fieldset>
168
+
169
+
170
+
171
+ <fieldset>
172
+
173
+ <legend>フォーム群2-2</legend>
174
+
175
+ <p><input type="text" name="table[1][group][1][0]"></p>
176
+
177
+ <p><input type="text" name="table[1][group][1][1]"></p>
178
+
179
+ </fieldset>
180
+
181
+ </fieldset>
182
+
183
+ </form>
184
+
185
+
186
+
187
+ <script>
188
+
189
+ 'use strict';
190
+
191
+ jQuery('form').on('click', '.insert-fieldset', function handleClick (event) {
192
+
193
+ var input = jQuery(event.target),
194
+
195
+ nestLevel = input.parents('fieldset').length + 1,
196
+
197
+ lastFieldset = input.nextAll('fieldset:last()'),
198
+
199
+ fieldset = lastFieldset.clone(true),
200
+
201
+ legend = fieldset.find('legend'),
202
+
203
+ textNode = legend[0].firstChild,
204
+
205
+ beforeTopLevelCaption = textNode.data,
206
+
207
+ match = /^(\D*(?:\d+\D*)*)(\d+)$/.exec(beforeTopLevelCaption),
208
+
209
+ afterTopLevelCaption = match[1] + ++match[2];
210
+
211
+
212
+
213
+ textNode.data = afterTopLevelCaption;
214
+
215
+
216
+
217
+ for (var i = 1, len = legend.length, text, index; i < len; ++i) {
218
+
219
+ textNode = legend[i].firstChild;
220
+
221
+ text = textNode.data;
222
+
223
+ index = text.indexOf(beforeTopLevelCaption);
224
+
225
+
226
+
227
+ if (index !== -1) {
228
+
229
+ textNode.data = text.slice(0, index) + afterTopLevelCaption + text.slice(index + afterTopLevelCaption.length);
230
+
231
+ }
232
+
233
+ }
234
+
235
+
236
+
237
+ for (var i = 0, inputList = fieldset.find('input[type="text"]'), len = inputList.length, input, name, reg = /[\d+(?=])/g, result, j, index, bracket; i < len; ++i) {
238
+
239
+ input = inputList[i];
240
+
241
+ name = input.name;
242
+
243
+ j = 0;
244
+
245
+ reg.lastIndex = 0;
246
+
247
+
248
+
249
+ while (result = reg.exec(name), ++j < nestLevel);
250
+
251
+
252
+
253
+ index = result.index;
254
+
255
+ bracket = result[0];
256
+
257
+ input.name = name.slice(0, index) + '[' + (+bracket.slice(1) + 1) + ']' + name.slice(index + bracket.length + 1);
258
+
259
+ }
260
+
261
+
262
+
263
+ lastFieldset.after(fieldset);
264
+
265
+ });
266
+
267
+ </script>
268
+
269
+ ```
270
+
271
+
272
+
79
273
  Re: annderberさん