-
Notifications
You must be signed in to change notification settings - Fork 4
/
824.txt
146 lines (111 loc) · 9.02 KB
/
824.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
[3] [DFN[[RUBYB[里親付け]@en[foster parenting]]]]とは、 [[HTML]] の[[構文解析]]において
[CODE(HTMLe)@en[[[table]]]] [[要素]]の[[子孫]]になりそうな[[要素]]や[[テキスト]]を他の[[要素]]に挿入することをいいます。
* 仕様書
[REFS[
-[5] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-07-20 22:41:10 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#foster-parent>
]REFS]
* 文脈
[11] [[里親付け]]は、[[表]]を構成する[[要素]] ([[こま]]や[[見出し]]以外)
の[[内容]]となるべき部分に[[表]]以外の[[要素]]や[[テキスト]]が出現した時に行われます。
[EG[
[12] 例えば
[PRE(HTML code)[
<table>hoge<p>abc</p><tr><td>aaa</table>
]PRE]
... では「hoge」や「<p>」が[[里親付け]]によって処理されます。
「abc」は [CODE(HTMLe)@en[[[p]]]] [[要素]]の[[子供]]となりますから、
この[[テキスト]]自体は[[里親付け]]の対象ではありません。
]EG]
[13] [[挿入モード]]としては [[in table]]、[[in table body]]、
[[in table row]] が該当します。
;; [15] ただし仕様書上は「[[using the rules for]]」によって規定を他の[[挿入モード]]に委ねていることがあるので、
[[in body]] や [[in head]] などの仕様上の規定に基づく[[要素]]や[[テキスト]]の挿入が[[里親付け]]されることがあります。
;; [16] また[[里親付け]]は [[AAA]] や[[活性書式付け要素の再構築]]の内部で発生することもあります。
[34] [[里親付け]]が有効な状態で処理が行われるのは、 >>13 の[[挿入モード]]における
「[[空白]]以外の[[文字字句]]」、「[CODE(HTML)@en[[[<input type=hidden>]]]] 以外の
[CODE(HTMLe)@en[[[input]]]] [[開始タグ]]」、「その他の[[開始タグ]]」、「その他の[[終了タグ]]」
です。[[空白]]、[[注釈字句]]、[CODE(HTML)@en[[[DOCTYPE]]]]、[[EOF]]
は[[里親付け]]の影響を受けません。[[終了タグ]]もほとんどは影響を受けませんが、
[CODE(HTMLe)@en[[[br]]]] や [CODE(HTMLe)@en[[[p]]]] の[[終了タグ]]が[[開始タグ]]に置き換えられ、
影響をうけることがあります。また[[終了タグ]]によって [[AAA]]
が実行されて[[要素]]が[[挿入]]されることもあります。
[14] [[里親付け]]は[[HTML構文解析器]]でのみ行われ、[[XML構文解析器]]では行われません。
[36] [[里親付け]]は、構文的に正しくない[[文書]]を処理するための規則です。
[[HTML Standard]] に適合する [[HTML文書]]では、
[[里親付け]]が動作することはありません。
[HISTORY[
[37] 現在の [[DOM]] が整備される前の [[Webブラウザー]]は、
[[表]]を[[構文解析]]する際に、[[表]]を構成する[[こま]]を記憶しつつ、
[CODE(HTMLe)@en[[[table]]]] [[要素]]内部にありながら[[表]]の一部を構成しない[[要素]]や[[テキスト]]をその場で[[レンダリング]]し、
[CODE(HTMLe)@en[[[table]]]] [[終了タグ]]まで到達してから[[表]]を[[レンダリング]]する形になっていました。
[38] この伝統的な[[レンダリング]]と [[DOM]] との整合性から、
現在の[[里親付け]]を行う[[構文解析]]になっています。
]HISTORY]
* 処理
[17] 必要なら[[里親付け]]を考慮した[[節点]]の挿入位置のことを仕様書は[DFN[[RUBYB[[[節点を挿入する適切な場所]]]@en[appropriate place for inserting a node]]]]
[SRC[>>5]] と呼んでいます。これは次のように決定します [SRC[>>5]]。
[FIG(steps)[
= [18] 与えられた[[節点]] (なければ[[現在節点]]) について考えます。
= [19] [[里親付け]]が有効になっていて、かつ >>18 の[[節点]]が
[CODE(HTMLe)@en[[[table]]]], [CODE(HTMLe)@en[[[thead]]]],
[CODE(HTMLe)@en[[[tbody]]]], [CODE(HTMLe)@en[[[tfoot]]]], [CODE(HTMLe)@en[[[tr]]]]
のいずれかなら、
== [22] [[開いている要素のスタック]]上に >>18 より前にある[[節点]]から
直近の [CODE(HTMLe)@en[[[template]]]] や [CODE(HTMLe)@en[[[table]]]] を探します。
== [23] [CODE(HTMLe)@en[[[template]]]] があれば、その[[雛形内容]]の末尾とします。
== [24] そうでなく [CODE(HTMLe)@en[[[table]]]] があれば、
=== [26] [CODE(HTMLe)@en[[[table]]]] が[[親節点]]を持てば、
[[親節点]]における [CODE(HTMLe)@en[[[table]]]] の直前とします。
=== [27] なければ、[[開いている要素のスタック]]上で >>18 の直前にある[[要素]]の末尾とします。
== [25] どちらもなければ、[[開いている要素のスタック]]の最古の[[要素]]の末尾とします。
= [20] それ以外で >>18 の[[節点]]が [CODE(HTMLe)@en[[[template]]]]
なら、その[[雛形内容]]の末尾とします。
= [21] それ以外なら、 >>18 の[[節点]]の末尾とします。
]FIG]
[29] [[スクリプト]]によって [CODE(HTMLe)@en[[[table]]]] が移動されている場合には、
[[里親付け]]される[[節点]]は [CODE(HTMLe)@en[[[table]]]]
が元あった位置ではなく、現に存在する位置の前に挿入されます。
ただし [CODE(HTMLe)@en[[[table]]]] [[要素]]の[[親節点]]がない場合には、
元あった位置近くに挿入されます。
;; [31] <http://software.hixie.ch/utilities/js/live-dom-viewer/?%3Ca%20href%3Dx%3E%3Ctable%3E%3Ca%20href%3Dy%3Ea%3C%2Fa%3E%3Cscript%3Et%20%3D%20document.getElementsByTagName(%27table%27)%5B0%5D%3Bt.parentNode.removeChild(t)%3C%2Fscript%3Eb>
のように [CODE(HTMLe)@en[[[table]]]] が元々挿入されていた[[要素]]が既に[[開いている要素のスタック]]から除去されていることがありますから、
[CODE(HTMLe)@en[[[table]]]] [[要素]]が元あった位置そのものとは限りません。
[28] [CODE(HTMLa)@en[[[innerHTML]]]] や [CODE(HTMLe)@en[[[template]]]]
で [CODE(HTMLe)@en[[[table]]]] の[[親]]が存在していない場合には、
[[里親付け]]されない場合と同じように末尾に[[節点]]が挿入されます。
[30] [CODE(HTMLe)@en[[[table]]]] の[[親要素]]が[[文書]]になっている場合、
[[根要素]]の前に[[テキスト]]や[[要素]]を挿入することになりますが、
これは [[DOM]] の制約で禁止されていますから、どこにも挿入されないことになります。
[32] この「[[節点を挿入する適切な場所]]」の定義は、
[[HTML構文解析器]]の仕様上[[節点]]が挿入されるほとんどすべての場所で参照されています。
;; [33] [[AAA]] で既存の[[節点]]を移動する位置の決定では参照されていません。
[[AAA]] でも新しい[[節点]]の挿入は[[節点を挿入する適切な場所]]に行われます。
[35] [[節点を挿入する適切な場所]]の決定は、ほとんどは定型の手順
([[insert a character]], [[insert a comment]], [[insert a foreign element]])
に含まれています。それ以外のやや特殊な参照のされ方をするのは、
[[AAA]] での新しい[[節点]]の挿入 ([[子供]]や[[挿入]]先が特殊)
と [[HTML]] [CODE(HTMLe)@en[[[script]]]] [[開始タグ]]の処理
(通常の[[挿入]]処理に加え、[[要素]]に特殊なフラグを設定する)
の2箇所だけです。
* 歴史
[4] [CITE@en[(X)HTML5 Tracking]] ([TIME[2009-09-06 10:45:38 +09:00]] 版) <http://html5.org/tools/web-apps-tracker?from=2731&to=2732>
[CODE(DOMa)@en[[[parentNode]]]] を直接見ない形に改められました。閉じられていない [CODE(HTMLe)@en[[[a]]]] [[要素]]があって表の内外で入れ子になっている場合や、
[[スクリプト]]によって[[要素]]構造が操作された場合の動作に影響が出ます。
[2] [CITE@en[(X)HTML5 Tracking]]
([TIME[2009-09-06 10:30:15 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=2987&to=2988>
[CODE(HTMLe)@en[[[style]]]]、[CODE(HTMLe)@en[[[script]]]]、
[CODE(HTML)@en[[[<input type=hidden>]]]] に関して[[里親付け]]が行われなくなりました。
[1] [CITE@en[(X)HTML5 Tracking]]
([TIME[2009-09-05 20:32:09 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=3381&to=3382>
[[空白文字]]の[[里親付け]]を行うかどうかの決定方法が変更されました。
[6] [CITE[IRC logs: freenode / #whatwg / 20090709]]
([TIME[2009-09-12 22:13:44 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20090709#l-210>
[10] 次の2つの補助的な用語は仕様の改訂で使われなくなっています。
[8] 挿入先の[[要素]]を[DFN[[RUBYB[里親要素][foster parent element]]]]といいます。
[9] ある[[節点]]が[[里親要素]]に挿入されることを、[[節点]]が[DFN[[RUBYB[[[里親付け]]される]@en[foster parented]]]]といいます。
[7] [CITE@en[Web Applications 1.0 r8665 PARSER: Add a parse error for non-space characters in <table> elements]]
( ([TIME[2014-06-09 14:43:00 +09:00]] 版))
<http://html5.org/r/8665>