多次元配列
これが非常に厄介で例えばname="hoge[0][huga][1][]のようなフォームが沢山あります。
逆に質問させて頂きたいのですが、なぜそんなに複雑な名前が必要なのでしょうか。
JavaScriptで動的に要素を増やす場合に配列構造が必要になるのは分かります。
が、formはネストできず、formと各要素の関係性も一対多なので、要素の名前も一次元配にしかなり得ないと考えています。
フォーム群1に対して、フォーム群1-1,1-2が増えて行くのなら、
HTML
1<fieldset>
2 <legend>フォーム群1-1</legend>
3 <input name="foo-1[0]">
4 <input name="foo-1[1]">
5</fieldset>
6
7<fieldset>
8 <legend>フォーム群1-2</legend>
9 <input name="foo-2[0]">
10 <input name="foo-2[1]">
11</fieldset>
サーバサイドで多次元配列を受け取れるなら、
HTML
1<fieldset>
2 <legend>フォーム群1-1</legend>
3 <input name="foo[0][0]">
4 <input name="foo[0][1]">
5</fieldset>
6
7<fieldset>
8 <legend>フォーム群1-2</legend>
9 <input name="foo[1][0]">
10 <input name="foo[1][1]">
11</fieldset>
index値が多少増える程度で名前はそこまで長くはならないように思います。
JavaScriptコード
javascript側でのフォーム追加処理はこんな感じです。※jquery使ってます
HTMLが見えないのでどういう理屈でそのコードに至ったのかまで読み取れませんでしたが、私なら次のように書きます。
HTML
1<form>
2 <input class="insert-fieldset" type="button" value="追加">
3 <fieldset>
4 <legend>フォーム群1</legend>
5 <p><input type="text" name="table[0][text][0]"></p>
6 <p><input type="text" name="table[0][text][1]"></p>
7
8 <input class="insert-fieldset" type="button" value="追加">
9
10 <fieldset>
11 <legend>フォーム群1-1</legend>
12 <p><input type="text" name="table[0][group][0][0]"></p>
13 <p><input type="text" name="table[0][group][0][1]"></p>
14 </fieldset>
15
16 <fieldset>
17 <legend>フォーム群1-2</legend>
18 <p><input type="text" name="table[0][group][1][0]"></p>
19 <p><input type="text" name="table[0][group][1][1]"></p>
20 </fieldset>
21 </fieldset>
22
23 <fieldset>
24 <legend>フォーム群2</legend>
25 <p><input type="text" name="table[1][text][0]"></p>
26 <p><input type="text" name="table[1][text][1]"></p>
27
28 <input class="insert-fieldset" type="button" value="追加">
29
30 <fieldset>
31 <legend>フォーム群2-1</legend>
32 <p><input type="text" name="table[1][group][0][0]"></p>
33 <p><input type="text" name="table[1][group][0][1]"></p>
34 </fieldset>
35
36 <fieldset>
37 <legend>フォーム群2-2</legend>
38 <p><input type="text" name="table[1][group][1][0]"></p>
39 <p><input type="text" name="table[1][group][1][1]"></p>
40 </fieldset>
41 </fieldset>
42</form>
43
44<script>
45'use strict';
46jQuery('form').on('click', '.insert-fieldset', function handleClick (event) {
47 var input = jQuery(event.target),
48 nestLevel = input.parents('fieldset').length + 1,
49 lastFieldset = input.nextAll('fieldset:last()'),
50 fieldset = lastFieldset.clone(true),
51 legend = fieldset.find('legend'),
52 textNode = legend[0].firstChild,
53 beforeTopLevelCaption = textNode.data,
54 match = /^(\D*(?:\d+\D*)*)(\d+)$/.exec(beforeTopLevelCaption),
55 afterTopLevelCaption = match[1] + ++match[2];
56
57 textNode.data = afterTopLevelCaption;
58
59 for (var i = 1, len = legend.length, text, index; i < len; ++i) {
60 textNode = legend[i].firstChild;
61 text = textNode.data;
62 index = text.indexOf(beforeTopLevelCaption);
63
64 if (index !== -1) {
65 textNode.data = text.slice(0, index) + afterTopLevelCaption + text.slice(index + afterTopLevelCaption.length);
66 }
67 }
68
69 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) {
70 input = inputList[i];
71 name = input.name;
72 j = 0;
73 reg.lastIndex = 0;
74
75 while (result = reg.exec(name), ++j < nestLevel);
76
77 index = result.index;
78 bracket = result[0];
79 input.name = name.slice(0, index) + '[' + (+bracket.slice(1) + 1) + ']' + name.slice(index + bracket.length + 1);
80 }
81
82 lastFieldset.after(fieldset);
83});
84</script>
Re: annderberさん