/
438.txt
548 lines (435 loc) · 28.8 KB
/
438.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
[1] [DFN[[RUBYB[[[フォーム被関連付け要素]]]@en[form-associated element]]]]は、[[フォーム所有子]]を持つことができる[[要素]]です
[SRC[>>3]]。[[フォーム被関連付け要素]]は [CODE(HTMLe)@en[[[form]]]] [[要素]]と関係を持つことができ、
これを[[要素]]の[DFN[[RUBYB[[[フォーム所有子]]]@en[form owner]]]]といいます [SRC[>>24]]。
[71] [[フォーム所有子]]は[[木構造]]に基づき自動的に決まりますが、 [CODE(HTMLa)@en[[[form]]]]
[[内容属性]]によって[[著者]]が上書きすることもできます。どの[[要素]]が[[フォーム所有子]]であるかは
[CODE(DOMa)@en[[[form]]]] [[IDL属性]]によって取得できます。
* 仕様書
[REFS[
- [2] [[HTML Standard]]
-- [3] '''<http://www.whatwg.org/specs/web-apps/current-work/complete.html#form-associated-element>'''
--- [[フォーム被関連付け要素]]
-- [24] '''<http://www.whatwg.org/specs/web-apps/current-work/complete.html#association-of-controls-and-forms>'''
--- [[フォーム所有者]]
-- [94] <http://www.whatwg.org/specs/web-apps/current-work/complete.html#insert-an-html-element>
]REFS]
* 分類
[124] [[フォーム被関連付け可能要素]]には次のような小分類があります。
[FIG[
- [17] [[フォーム被関連付け要素]]
-- [123] [DEL[[[再関連付け可能要素]]]]
-- [18] [[被列挙要素]]
-- [19] [[ラベル付け可能要素]]
-- [20] [[提出可能要素]]
--- [22] [[ボタン]]
---- [23] [[提出ボタン]]
-- [21] [[再設定可能要素]]
]FIG]
[138] ただし[[ラベル付け可能要素]]には、[[フォーム被関連付け可能要素]]でないものも含まれています。
** フォーム被関連付け要素の一覧
[FIG(short list)[
- [4] [CODE(HTMLe)@en[[[button]]]]
- [5] [CODE(HTMLe)@en[[[fieldset]]]]
- [122] [CODE(HTMLe)@en[[[img]]]]
- [6] [CODE(HTMLe)@en[[[input]]]]
- [7] [CODE(HTMLe)@en[[[keygen]]]]
- [10] [CODE(HTMLe)@en[[[object]]]]
- [11] [CODE(HTMLe)@en[[[output]]]]
- [13] [CODE(HTMLe)@en[[[select]]]]
- [14] [CODE(HTMLe)@en[[[textarea]]]]
]FIG]
[15] [CODE(HTMLe)@en[[[option]]]], [CODE(HTMLe)@en[[[optgroup]]]], [CODE(HTMLe)@en[[[legend]]]],
[CODE(HTMLe)@en[[[datalist]]]] は含まれていません。
[132] [CODE(HTMLe)@en[[[object]]]] は理論上は[[フォーム制御子]]として使えるため、ここに含まれています。
[133] [CODE(HTMLe)@en[[[img]]]] は歴史的経緯から [CODE(JS)@en[document.forms[n].imgname]] のようにアクセスできるため、
内部的に[[フォーム]]との関連付けを保持しており、ここに含まれています。
[HISTORY[
[137] [CODE(HTMLe)@en[[[meter]]]] と [CODE(HTMLe)@en[[[progress]]]] は >>136
により一時的に含まれていました。
[8] かつては [CODE(HTMLe)@en[label]] も含まれていました。
]HISTORY]
;; [139] これらはいずれも[[字句内容]]、[[フロー内容]]として使うことができる[[要素]]です。
** 再関連付け可能要素
[HISTORY[
[125] [DFN[[RUBYB[[[再関連付け可能要素]]]@en[reassociateable element]]]]は、
[CODE(HTMLa)@en[[[form]]]] [[内容属性]]、[CODE(DOMa)@en[[[form]]]] [[IDL属性]]を有する[[フォーム所有子]]を指定可能な[[フォーム被関連付け要素]]です。
[FIG(short list)[
- [CODE(HTMLe)@en[[[button]]]]
- [CODE(HTMLe)@en[[[fieldset]]]]
- [CODE(HTMLe)@en[[[input]]]]
- [CODE(HTMLe)@en[[[keygen]]]]
- [CODE(HTMLe)@en[[[label]]]]
- [CODE(HTMLe)@en[[[object]]]]
- [CODE(HTMLe)@en[[[output]]]]
- [CODE(HTMLe)@en[[[select]]]]
- [CODE(HTMLe)@en[[[textarea]]]]
]FIG]
[9] [CODE(HTMLe)@en[label]] から [CODE(HTMLa)@en[form][form=""]]
[[内容属性]]が削除されたことで、[[被列挙要素]]と同じとなり、廃止されました。
]HISTORY]
** 一覧
[127] 各分類に属する[[要素]]の一覧は >>126 にあります。
[REFS[
- [126] [CITE[data-web-defs/data/elements.json at master · manakai/data-web-defs]] ([TIME[2014-04-06 02:53:24 +09:00]] 版) <https://github.com/manakai/data-web-defs/blob/master/data/elements.json>
]REFS]
* フォーム所有子
[72] [[フォーム所有子]]は、[[null]] または [CODE(HTMLe)@en[[[form]]]] [[要素]]1つです
[SRC[>>24]]。
- [74] [CODE(HTMLa)@en[[[form]]]] [[内容属性]]が [CODE(HTMLa)@en[[[form]]]] [[要素]]の [[ID]]
を正しく指していれば、その [CODE(HTMLa)@en[[[form]]]] [[要素]]が[[フォーム所有子]]です。
- [73] [[直近祖先]]の [CODE(HTMLe)@en[[[form]]]] [[要素]]があれば、それが[[フォーム所有子]]です。
- [75] そうでなければ、[[フォーム所有子]]は [[null]] です。
** フォーム所有子の変化
[108] [[フォーム所有者]]は次の場合に変化します。
[FIG(list)[
- [80] [[フォーム被関連付け要素]]が作られた時点では[[フォーム所有者]]は [[null]] でなければ[['''なりません''']] [SRC[>>24]]。
- [81] [[フォーム被関連付け要素]]が[[フォーム]]に[DFN[[RUBYB[関連付けられる]@en[associated]]]] ([DFN[[RUBYB[フォーム関連付け]@en[form association]]]]) と、[[フォーム所有者]]はその[[フォーム]]に設定されなければ[['''なりません''']] [SRC[>>24]]。
- [82] [[フォーム被関連付け要素]]かその[[祖先]]が[[文書に挿入]]されたら、[[フォーム所有者を再設定]]しなければ[['''なりません''']] [SRC[>>24]]。
- [120] [[フォーム被関連付け要素]]と[[親節点]]が別の [[home subtree]] になったとき、[[フォーム所有者を再設定]]してなければ[['''なりません''']] [SRC[>>24]]。
- [84] [[フォーム被関連付け要素]]の [CODE(HTMLa)@en[[[form]]]] [[内容属性]]が追加・変更・削除された時は、[[フォーム所有者を再設定]]しなければ[['''なりません''']] [SRC[>>24]]。
- [83] [[フォーム被関連付け要素]]が [CODE(HTMLa)@en[[[form]]]] [[内容属性]]を持つ場合、[[文書]]内の[[要素]]の [[ID]] が変化したり、[[ID]] を持った[[要素]]が[[文書]]に追加・削除されたりしたときは、[[フォーム所有者を再設定]]しなければ[['''なりません''']] [SRC[>>24]]。
- [95] [[HTML構文解析器]]による[RUBYB[[[HTML要素の挿入]]]@en[insert an HTML element]]によって[[フォーム被関連付け要素]]が作られた場合であって、 [CODE(HTMLe)@en[[[template]]]] [[要素]]の[[子孫]]でなく、[[[CODE(HTMLe)@en[form]]要素指示子]]が [[null]] ではなく、[CODE(HTMLa)@en[[[form]]]] [[内容属性]]がなく、挿入先が [[[CODE(HTMLe)@en[form]]要素指示子]]と同じ[[家部分木]]に属する場合には、挿入の直前に[[[CODE(HTMLe)@en[form]]要素指示子]]が指す [CODE(HTMLe)@en[[[form]]]] [[要素]]を[RUBYB[関連付け]@en[associate]]しなければなりません
[SRC[>>94]]。
]FIG]
** フォーム所有者の再設定
[85] [[フォーム被関連付け要素]]の[DFN[[RUBYB[フォーム所有者を再設定]@en[reset the form owner]]]]する場合は次のようにしなければなりません [SRC[>>24]]。
= [86] [[フォーム所有者]]が [[null]] でなく、[CODE(HTMLa)@en[[[form]]]] [[内容属性]]がなく、[[祖先鎖]]が変化した後であっても[[フォーム所有者]]が[[直近祖先]]たる [CODE(HTMLa)@en[[[form]]]] [[要素]]のままなら、
== 何もせずに終わります。
= [87] [[フォーム所有子]]を [[null]] とします。
= [88] [CODE(HTMLa)@en[[[form]]]] [[内容属性]]があれば、
== [89] [CODE(HTMLa)@en[[[form]]]] [[内容属性]]の値と一致する [[ID]] を持った[[文書]]中の最初の[[要素]]が
[CODE(HTMLe)@en[[[form]]]] [[要素]]なら、
=== その [CODE(HTMLe)@en[[[form]]]] と[RUBYB[関連付け]@en[associate]]ます。
== 終わります。
= [90] そうではなく、[[祖先]]に [CODE(HTMLe)@en[[[form]]]] [[要素]]があるなら、
== [[直近祖先]]たる [CODE(HTMLe)@en[[[form]]]] [[要素]]と[RUBYB[関連付け]@en[associate]]ます。
= [91] そうでないなら、どの[[フォーム]]とも関連付けないままにします。
[92] つまり、>>73-75 のような状況を新たな木構造の元で再構築するということですね。
** 例
[EG[
[93]
[PRE(HTML bad example code)[
...
<form id="a">
<div id="b"></div>
</form>
<script>
document.getElementById('b').innerHTML =
'<table><tr><td><form id="c"><input id="d"></table>' +
'<input id="e">';
</script>
...
]PRE]
[CODE(HTML)@en[e]] [[要素]]の[[フォーム所有子]]は [CODE(HTML)@en[c]] ではなく
[CODE(HTML)@en[a]] になります [SRC[>>24]]。
[CODE(HTMLa)@en[[[innerHTML]]]] が内部的に[[HTML構文解析器]]で解釈を終えた時点では、確かに
[CODE(HTML)@en[e]] の[[フォーム所有者]]は [CODE(HTML)@en[c]] です ([CODE(HTML)@en[[[form]]]]
[[要素]]が閉じられていませんから)。ところが [CODE(HTML)@en[e]] [[要素]]が [CODE(HTML)@en[b]]
[[要素]]の[[子供]]となった瞬間に、[[フォーム所有者の再設定]]が起こり、
[CODE(HTML)@en[a]] に選び直されます。
]EG]
* form 要素指示子
[96] [[HTML構文解析器]]の [DFN[[CODE(HTMLe)@en[form]] [RUBYB[要素指示子]@en[element pointer]]]]は、
最後に開かれて閉じていない [CODE(HTMLe)@en[[[form]]]] [[要素]]を指すものです
[SRC[>>98]]。
** 仕様書
[REFS[
- [97] [[HTML Standard]]
-- [98] '''<http://www.whatwg.org/specs/web-apps/current-work/complete.html#form-element-pointer>'''
-- [100] <http://www.whatwg.org/specs/web-apps/current-work/complete.html#insert-an-html-element>
-- [101] <http://www.whatwg.org/specs/web-apps/current-work/complete.html#parsing-html-fragments>
]REFS]
** 省略可能性
[147] [[[CODE(HTMLe)@en[form]]要素指示子]]は、[[スクリプト無効]]な[[構文解析器]]でも実装する必要があります。
(値によって[[構文解析]]の結果が変化します。) しかし[[フォーム所有者の再設定]]の呼び出しは、
[[スクリプト]]と[[フォーム]]を実装していないなら、省略できます。
** 値の変化
[FIG(list)[
- [99] 初期状態では値は [[null]] です [SRC[>>98]]。
- [102] [[HTML構文解析器]]によって [CODE(HTMLe)@en[[[form]]]] [[要素]]が作られるときに、その[[要素]]に設定されます。
- [103] [[HTML構文解析器]]によって [CODE(HTMLe)@en[[[form]]]] [[要素]]が閉じられるときに、 [[null]] に設定されます。
- [104] [[HTML素片構文解析算法]]において、文脈[[要素]]を含む[[祖先]]のいずれかが [CODE(HTMLe)@en[[[form]]]] [[要素]]なら、[[直近祖先]]たる [CODE(HTMLe)@en[[[form]]]] [[要素]]に設定されます
[SRC[>>101]]。
]FIG]
[105] つまり、[[開始タグ]]があって[[終了タグ]]が(まだ)ない最後の [CODE(HTMLe)@en[[[form]]]]
[[要素]]を指している状態になっています。
[141] [CODE(HTMLe)@en[[[form]]]] [[終了タグ]]は、たとえそれによって閉じられる
[CODE(HTMLe)@en[[[form]]]] [[要素]]が存在していなくても、
[[[CODE(HTMLe)@en[form]]要素指示子]]を [[null]] に設定する効果があります。
[CODE(HTMLe)@en[[[table]]]] などをトリッキーに使って、あるいは[[素片構文解析]]によってそのような状況が生じることがあります。
[142] ただし、[[素片構文解析]]の場合は、一時的に架空の[[木]]において[[構文解析]]を行った後、
得られた[[節点]]が指定された位置に挿入される、という形を取っており、
最終的な挿入は[[構文解析器]]による挿入ではありませんから、
たとえ[[[CODE(HTMLe)@en[form]]要素指示子]]により特別な[[フォーム所有者]]の関連付けが行われていたとしても、
再設定により失われてしまいます。
[EG[
[143] <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Cform%20id%3Da%3E%0A%3Cscript%3E%0A%20%20document.forms%5B0%5D.innerHTML%20%3D%20%27%3C%2Fform%3E%3Ctable%3E%3Cform%20id%3Db%3E%3Ctr%3E%3Ctd%3E%3Cinput%3E%27%3B%0A%20%20w%20(document.getElementsByTagName%20(%27input%27)%5B0%5D.form.id)%3B%0A%3C%2Fscript%3E>
の例では、 [CODE(HTMLe)@en[[[form]]]] [[要素]]の [CODE(DOMa)@en[[[innerHTML]]]]
を設定しています。その場合[[[CODE(HTMLe)@en[form]]要素指示子]]が設定されてから[[構文解析]]がはじまるので、
[CODE(HTMLe)@en[[[form]]]] [[開始タグ]]は無視されます。ところが本例では
[CODE(HTMLe)@en[[[form]]]] [[終了タグ]]によって[[[CODE(HTMLe)@en[form]]要素指示子]]が
[[null]] に設定されるため、 [CODE(HTMLe)@en[[[form]]]] [[開始タグ]]は無視されず、
[CODE(HTMLe)@en[[[form]]]] [[要素]]が作られます。
[144] ただし [CODE(HTMLe)@en[[[form]]]] [[要素]]は[[里親付け]]により [CODE(HTMLe)@en[[[table]]]]
[[要素]]の[[兄]]となり、 [CODE(HTMLe)@en[[[td]]]] [[要素]]内の
[CODE(HTMLe)@en[[[input]]]] [[要素]]はその [CODE(HTMLe)@en[[[form]]]] [[要素]]の[[子孫]]とはなりません。
それでも[[[CODE(HTMLe)@en[form]]要素指示子]]によって両者は一旦関連付けられるのですが、
[[素片構文解析]]の全体が完了した後、得られた[[要素]]が1つ目の [CODE(HTMLe)@en[[[form]]]]
[[要素]]の[[子供]]として挿入され、[[フォーム所有者の再設定]]が実行されます。
この時に[[木構造]]に従い[[フォーム所有者]]が決定されるので、
[CODE(HTMLe)@en[[[input]]]] [[要素]]の[[フォーム所有者]]は変更されるのです。
]EG]
[145] なお、先祖に [CODE(HTMLe)@en[[[form]]]] [[要素]]が存在するケースの[[素片構文解析]]では、
[[[CODE(HTMLe)@en[form]]要素指示子]]が[[構文解析]]中に変更されない場合、
[[構文解析]]の時点では[[フォーム所有者]]は設定されず、
最後の挿入の時点で[[木構造]]に従い[[フォーム所有者]]が決まることになります。
;; [[フォーム所有者]]と[[構文解析]]によって作成された[[要素]]が同じ[[家部分木]]に属さないからです。
[[字句から要素の作成]]の項を参照。
** 構文解析への影響
[106] [[[CODE(HTMLe)@en[form]]要素指示子]]が [CODE(HTMLe)@en[[[form]]]] [[要素]]を指している間は
[[HTML構文解析器]]が [CODE(HTMLe)@en[[[form]]]] [[要素]]を新たに作ることはありません。
つまり、 [CODE(HTMLe)@en[[[form]]]] [[要素]]の入れ子状態を [[HTML構文解析器]]自身が作り出すことはありません。
[119] [CODE(HTMLe)@en[[[template]]]] [[要素]]内では[[[CODE(HTMLe)@en[form]]要素指示子]]は無視され、
[[フォーム制御子]]と[[フォーム]]の関連付けは行われません。
[146] [[構文解析器]]が [[AAA]] によって[[要素]]を移動した場合、
[[構文解析器]]による[[挿入]]としてではなく、
通常の [[insert]] として処理されるため、
結果的に[[[CODE(HTMLe)@en[form]]要素指示子]]は無視されます。
;; <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Ctable%3E%3Cform%3E%3Ctd%3E%3Cb%3E%3Cp%3E%3Cinput%3E%3C%2Fb%3E%3Cscript%3Ew(document.querySelector(%27input%27).form)%3C%2Fscript%3E>
** 関連
[107] [[[CODE(HTMLe)@en[form]]要素指示子]]は、[[HTML構文解析器]]によって[[フォーム被関連付け要素]]が[[文書]]に挿入される時点で[[フォーム所有者]]の決定に使われます
(>>95)。
[109] [[フォーム所有者の再設定]]が起こる (>>108) と
[[[CODE(HTMLe)@en[form]]要素指示子]]の影響で生じた[[フォーム]]との関連付けは解消されます。
従って[[[CODE(HTMLe)@en[form]]要素指示子]]の影響は[[構文解析]]の直後に限定されます
[WEAK[(といっても[[構文解析]]は [CODE(DOMa)@en[[[innerHTML]]]] などでいつでも発生し得ます)]]。
[[[CODE(HTMLe)@en[form]]要素指示子]]がなかった場合との違いが生じるのは、
[CODE(HTMLe)@en[[[form]]]] [[要素]]が[[終了タグ]]無しで閉じられた後に続く[[フォーム制御子]]が、 [CODE(HTMLe)@en[[[form]]]] [[要素]]の[[子孫]]でもないのに関連付けられる場合だけです。
;; [110] [[HTML素片構文解析算法]]の中で [CODE(HTMLe)@en[[[form]]]] [[要素]]が閉じられると、
その[[文脈節点]]の[[先祖]]である [CODE(HTMLe)@en[[[form]]]] [[要素]]の[[子孫]]であるにも関わらず関連付けられる[[フォーム制御子]]が発生しそうに思えますが、
そのような状況で [CODE(HTMLe)@en[[[form]]]] [[要素]]を開くことがそもそもできないはずです。
* [CODE(HTMLa)@en[form]] 属性 (HTML)
@@ 以下は古い内容が含まれます。
[40]
[[HTML]] の[[フォーム制御子]]等の
[DFN[[CODE(HTMLa)@en[form]] [[属性]]]]は、
[[フォーム制御子]]が所属する[[フォーム]]を指定します。
[41]
:状態:[[WHATWG]] [[WD]]
:[[要素型]]:[[フォーム制御子]]、[CODE(HTMLe)@en[[[fieldset]]]]
:[[属性名]]:[CODE(HTMLa)@en[[[form]]]]
([Q@en[[[form]]]] ([Q@en[[[フォーム]]]]) より)
:[[属性値]]:[CODE@en[[[IDREFS]]]] (>>42)
:[[既定値]]:([[先祖]]により決定) (>>43)
** 仕様書
- [76] [[Web Applications 1.0]]
-- [77] '''<http://www.whatwg.org/specs/web-apps/current-work/complete.html#form-owner>'''
** 属性値
[79] [CODE(HTMLa)@en[[[form]]]] [[内容属性]]の[[属性値]]は、同じ[[文書]]の
[CODE(HTMLe)@en[[[form]]]] [[要素]]の [[ID]] でなければ[['''なりません''']] [SRC[>>77]]。
;;
[42]
[[Web Forms 2.0]] では、
[CODE(HTMLa)@en[[[form]]]] [[属性値]]は、
零個以上の
[CODE(HTMLe)@en[[[form]]]] [[要素]]の [CODE(XML)@en[[[ID]]]]
の[[空白]]区切り[[並び]]とされていました
[SRC@en[WF2 2.8]]。
** フォームの決定
[49]
[[利用者エージェント]]は、[[フォーム制御子]]や
[CODE(HTMLe)@en[[[fieldset]]]]
[[要素]]に関連付ける[[フォーム]]を次のように決定[['''しなければなりません''']]
[SRC@en[WF2 2.8]]:
= [CODE(HTMLa)@en[[[form]]]] [[属性]]があれば、
それに従います。
= [[直近]]の[[先祖]]である [CODE(HTMLe)@en[[[form]]]]
[[要素]]か、 [CODE(HTMLa)@en[[[form]]]] [[属性]]がある
[CODE(HTMLe)@en[[[fieldset]]]] [[要素]]があれば、
その[[フォーム]]とします。
= なければ、どの[[フォーム]]にも関連付けないとします。
[[#comment]]
** フォーム操作との関係
[50]
[[提出]][[ボタン]] ([CODE(HTML)@en[[[submit]]]]) や[[画像]]
([CODE(HTMLe)@en[[[image]]]]) は、
関連付けられた最初の[[フォーム]]のみを[[提出]][['''しなければなりません''']]。
[SRC@en[WF2 2.8]]
[51]
[[再設定]][[ボタン]] ([CODE(HTML)@en[[[reset]]]])
は、関連付けられたすべての[[フォーム]]を[[再設定]][['''しなければなりません''']]。
[SRC@en[WF2 2.8]]
[[#comment]]
** 誤り処理
[52]
[[文書]]中に複数現れる [CODE(XML)@en[[[ID]]]]
が [CODE(HTMLa)@en[[[form]]]] に指定された時に選択される[[フォーム]]は、
[CODE(DOMm)@en[[[getElementById]]]] [[メソッド]]と同じものと[['''しなければなりません''']]。
[SRC@en[WF2 2.8]]
;; [CODE(DOMm)@en[[[getElementById]]]] [[メソッド]]は、
その場合の動作は[[未定義]]としています。
しかし、 [CODE(HTMLa)@en[[[form]]]]
もそれと同じように動作しなければならない、ということです。
[53]
[CODE(HTMLa)@en[[[form]]]]
[[属性値]]中に同じ[[フォーム]]を複数回指定[['''してはなりません''']]。
[[利用者エージェント]]は、その場合、
最初の指定を除き、無視[['''しなければなりません''']]。
[SRC@en[WF2 2.8]]
** 例
[54]
[PRE(HTML example code)[
<table>
<thead>
<tr>
<th>Name</th>
<th>Value</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<form id="edit1" action="/edit" method="post">
<input type="hidden" name="id" value="1"/>
<input type="text" name="name" value="First Row"/>
</form>
</td>
<td>
<input form="edit1" type="text" name="value"/>
</td>
<td>
<input form="edit1" type="submit" name="Edit"/>
</td>
</tr>
<tr>
<td>
<form id="edit2" action="/edit" method="post">
<input type="hidden" name="id" value="2"/>
<input type="text" name="name" value="Second Row"/>
</form>
</td>
<td>
<input form="edit2" type="text" name="value"/>
</td>
<td>
<input form="edit2" type="submit" name="Edit"/>
</td>
</tr>
</tbody>
</table>
]PRE]
[[列]]ごとに別の[[フォーム]]になっています。
[SRC@en[WF2 2.8]]
[CODE(HTMLe)@en[[tbody]]]] の[[内容モデル]]の定義から、
[[Web Forms 1.0]] ではこのように[[表]]と[[フォーム]]を組合せることができませんでした。
[55]
[PRE(HTML example code)[
<form action="test.cgi">
<input type="text" name="q" form="fg fy">
<input type="submit" name="t" value="Test">
</form>
<form id="fg" action="google.cgi"><input type="submit" value="Google"></form>
<form id="fy" action="yahoo.cgi"><input type="submit" value="Yahoo"></form>
]PRE]
テキスト欄は2つの[[フォーム]]に関連付けられています。
また、[[フォーム]]が3つあり、それぞれが[[提出]][[ボタン]]を持っています。
[SRC@en[WF2 2.8]]
[Q@en[Google]] と [Q@en[Yahoo]] の2つのボタンは、
それぞれ別の[[フォーム処理エージェント]]に、
同じテキスト欄の内容を[[提出]]します。
最初の [Q@en[Test]] は、 [[Web Forms 2.0]]
に適合した[[利用者エージェント]]では、
テキスト欄の内容を[[提出]]しません。
未対応の[[利用者エージェント]]はテキスト欄の内容を[[提出]]します。
これは古い[[利用者エージェント]]のための fallback
として使うことができます。
* 歴史
[REFS[
- [61] [CITE[Cougar: ideas for <A>,<INPUT>]] ([TIME[2004-08-06 01:45:46 +09:00]] 版) <http://lists.w3.org/Archives/Public/www-html/1996Jul/0537.html>
]REFS]
[128] >>61 では後の [CODE(HTMLa)@en[[[form]]]] [[属性]]に相当する [CODE(HTMLa)@en[[[for]]]]
[[属性]]が提案されていました。
** Web Forms 2.0
[44] [CODE(HTMLa)@en[[[form]]]] [[属性]]は [[Web Forms 2.0]] で導入されました。
[REFS[
-[78] [[Web Forms 2.0]] [CSECTION@en[2.8. The [CODE(HTMLa)@en[[[form]]]] attribute]]
<http://www.whatwg.org/specs/web-forms/current-work/#formAttribute>
]REFS]
*** 処理モデル
[43]
[[フォーム制御子]]は通常[[先祖]]の [CODE(HTMLe)@en[[[form]]]]
と関連付けられますが、
[CODE(HTMLa)@en[[[form]]]] [[属性]]はこれを上書きし、
関連付ける[[フォーム]]を明示的に指定します。
[SRC@en[WF2 2.8]]
[46]
指定された [CODE(XML)@en[[[ID]]]] のうち、
[[文書]]中の[[要素]]を[[識別]]しないものや、
[CODE(HTMLe)@en[[[form]]]] [[要素]]を[[識別]]しないものは、
無視[['''しなければなりません''']]。
[SRC@en[WF2 2.8]]
[47]
[[空文字列]]を[[属性値]]として指定する
(か、 >>46 の無視の結果 [CODE(XML)@en[[[ID]]]]
が1つも含まれない) と、
[[フォーム制御子]]はどの[[フォーム]]にも関連付けられていない状態となります。
[SRC@en[WF2 2.8]]
[48]
[CODE(HTMLe)@en[[[fieldset]]]] [[要素]]に指定した場合は、
その[[子孫]]の[[フォーム制御子]]を関連付ける[[フォーム]]を指定します。
[SRC@en[WF2 2.8]]
;; [[子孫]]の[[フォーム制御子]]や [CODE(HTMLe)@en[[[fieldset]]]]
で更に [CODE(HTMLa)@en[[[form]]]] が指定されている場合は、
そちらが優先します。
** HTML5
[129] [[WF2]] はその後 [[HTML5]] (旧 [[Web Applications 1.0]]、現在の [[HTML Standard]]) に統合されました。
[70] 一瞬だけ [[HTML5]] で [CODE(HTMLe)@en[[[legend]]]] [[要素]]にも
[CODE(HTMLa)@en[[[form]]]] [[属性]]が追加されていましたが、すぐに削除されました。
[136] [CODE(HTMLe)@en[[[meter]]]] と [CODE(HTMLe)@en[[[progress]]]] を[[フォーム被関連付け可能要素]]の一部である[[ラベル付け可能要素]]とするために
>>134 で [CODE(HTMLa)@en[[[form]]]] [[属性]]が追加されましたが、 >>135 で[[ラベル付け可能要素]]が[[フォーム被関連付け可能要素]]でなくても良いこととされ、
[CODE(HTMLa)@en[[[form]]]] [[属性]]も削除されました。
[REFS[
- [134] [CITE@en[Web Applications 1.0 r4531 Make <progress>, <meter>, and <output> labelable with <label>.]] ([TIME[2010-01-07 12:40:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=4530&to=4531>
- [135] [CITE@en[Web Applications 1.0 r6221 Remove <progress form> and <meter form> since they are basically useless.]] ([TIME[2011-06-14 09:33:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=6220&to=6221>
]REFS]
[130] [[HTML5]] では[[フォーム所有者]]の概念の詳細や[[構文解析]]との相互関係が歴史上はじめて明文化されました。
[REFS[
- [111] [CITE@en[Bug 17845 – Some algorithms in the HTML Parser must also override the "reset the form owner" (e.g., Adoption Agency algorithm)]]
( ([TIME[2013-02-17 10:48:51 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=17845>
- [112] [CITE[IRC logs: freenode / #whatwg / 20130213]]
( ([TIME[2013-02-16 19:46:58 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20130213>
- [113] [CITE@en[Web Applications 1.0 r8186 Clarify which call to 'reset the form owner' is suppressed.]]
( ([TIME[2013-09-14 08:31:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8185&to=8186>
- [114] [CITE[''''''[''''''whatwg'''''']'''''' Form-associated elements and the parser]]
( ([TIME[2013-09-17 00:43:23 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-September/040843.html>
- [115] [CITE[''''''[''''''whatwg'''''']'''''' Elements should be removed from the past names map once it's no longer associated with the form element]]
( ([TIME[2013-09-26 22:45:44 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2013-September/040898.html>
- [116] [CITE@en[Web Applications 1.0 r8188 Make parser-driven form element pointer associations not happen when the element is inserted into a different home subtree than the form element, to avoid cross-subtree associations (which otherwise wouldn't be possible).]] ([TIME[2013-09-17 02:35:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=8187&to=8188>
- [117] [CITE@en[Web Applications 1.0 r8331 Change how the form element pointer affects parsing <template> elements, to reduce weirdness in templates (e.g. before you couldn't have a template that contained a form if it was itself inside a form).]] ([TIME[2013-12-05 04:02:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=8330&to=8331>
- [118] [CITE@en[Web Applications 1.0 r8337 innerHTML on template contents works like outside templates, when it comes to forms.]] ([TIME[2013-12-10 06:17:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=8336&to=8337>
- [121] [CITE@en[Web Applications 1.0 r8446 Turns out browsers reset the form owner not just when a node is taken from a document, but also when it's taken from a subtree. which makes sense.]]
( ([TIME[2014-01-31 06:51:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8445&to=8446>
- [131] [CITE@en[Web Applications 1.0 r8009 <img> is form-associated (because legacy), but doesn't have a form='' attribute (because sanity). So... update crazy town to be even more crazy.]] ([TIME[2013-07-03 06:17:00 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=8008&to=8009>
]REFS]
[140] [CITE@en[HTML Speech Incubator Group Final Report]]
( ([TIME[2011-12-05 17:46:22 +09:00]] 版))
<http://www.w3.org/2005/Incubator/htmlspeech/XGR-htmlspeech-20111206/#dfn-form>
[16] [CITE@en[13549 – 4.10.18 associating form elements with forms that do not contain them can cause navigation problems for AT and keyboard users]]
([TIME[2016-03-05 18:47:49 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=13549>
[25] [CITE@en[Editorial: synchronize with the DOM Standard · whatwg/html@21c6ec7]]
([TIME[2016-03-20 18:13:39 +09:00]] 版)
<https://github.com/whatwg/html/commit/21c6ec77594eb89b836d4872222f5916910967fd>
[26] [CITE@en[Remove <label form> and redefine label.form IDL attribute]]
( ([[zcorpan]]著, [TIME[2016-04-28 22:48:52 +09:00]]))
<https://github.com/whatwg/html/commit/99f0f1ae017523276ea4dd5784ec63a23a23834d>
[27] [CITE@en-GB-x-Hixie[Web Forms 2.0]]
( ([TIME[2014-03-06 04:51:55 +09:00]]))
<https://whatwg.org/specs/web-forms/current-work/#formAttribute>