[405] [DFN[[CODE(HTMLe)@en[object]] hack]] は、 [[HTML]] における[[段落]]内[[ブロック要素]]の扱いに関する問題の
controversial な解決方法 (hack) の1つです。
* 問題の概要
[406] [[段落]]はしばしば[[リスト]]をはじめとした「[[ブロック]]的なもの」を含みます。例えば、
[PRE[
そのような例には
(1) 敢えてそうマーク付けしなくてもさほど問題はないが、要素構造が意味的に不自然になるもの
(2) そうマーク付けしなくては意味的あるいは見た目的に意図通りとならないもの
などがあります。
]PRE]
といった[[文章]]は1つの「[[段落]]」の内部に[[リスト]]という「[[ブロック]]的なもの」が含まれます。
[407] [[HTML4]] では[[段落]]を表す [CODE(HTMLe)@en[[[p]]]] [[要素]]の内側に[[リスト]]を表す
[CODE(HTMLe)@en[[[ul]]]] [[要素]]をはじめとする[[ブロック水準要素]]を含めることができないと規定されていました。
しかし、現実には先に挙げた例のように[[段落]]内に[[ブロック]]的なものが含まれることがあるため、
これをどう[[マーク付け]]するかが問題とされました。
* 解法の概要
[408] この問題には [CODE(HTMLe)@en[[[p]]]] [[要素]]を用いない、[[ブロック水準要素]]を用いない、
[[マーク付け]]可能な形に[[文章]]を変更する、 [CODE(HTMLe)@en[[[p]]]]
[[要素]]の仕様を変更する、などいくつかの解法が提案されてきました。
[409] [CODE(HTMLe)@en[[[object]]]] hack は、 [CODE(HTMLe)@en[[[object]]]] [[要素]]の
(おそらくは[[バグ]]である) 仕様を利用して [CODE(HTMLe)@en[[[p]]]] [[要素]]も[[ブロック水準要素]]も利用し、
[[文章]]を変更せず、かつ [[HTML4]] に[[適合]]する形で前記の問題を解決するものです。
[410] >>406 に示した例は [CODE(HTMLe)@en[[[object]]]] hack を用いた場合
[PRE(HTML example code)[
そのような例には
などがあります。
]PRE]
のように[[マーク付け]]します。
* 歴史
[411] [CODE(HTMLe)@en[[[object]]]] hack は歴史的に何度も独立に考案されてきました。
[1]
1997年10月
[[すみけん]]氏が考案、 [[mimasa]] 氏が反対
[4]
[CITE[Re: It's a paragraph, but it's not? ]]
2001年1月
[5] [CITE[bubble hour - 2001/12 #1]]
2001年12月
一連の議論の中で [[satoshii]] 氏が[Q[発見]]
[6] [WEAK[2004-02-11 18:39:43 +00:00]] ''[[satoshii]]'': >>5 まぁ、なんつーか…お察し下さい。
[9] [CITE[Re: Validation errors and white blocks. ]]
2003年10月
[8] [CITE[Re: different bullet points for nested lists ]]
2003年11月
[3]
[CITE[Object?]]
2004年1月付け
[7] [CITE[XHTML 1.0 strict en lists ]]
2004年4月
[2]
[CITE[[whatwg] elements containing other block-level elements]]
2005年4月
[[Ian]] 氏の一案
[13] >>2 は [CODE(HTTP)[[[404]]]] だけど多分これ:
[CITE['''['''whatwg''']''' elements containing other block-level elements]] ([TIME[2009-02-26 03:21:33 +09:00]] 版)
[10]
[CITE[p要素の中にobject要素を介してブロック要素を含めることに関する議論 - 徒委記]]
2006年1月
[12]
[CITE[P element's content model restrictions]] ([[Leif Halvard Silli ]] 著, [TIME[2007-05-29 02:07:11 +09:00]] 版)
([[名無しさん]] [WEAK[2007-06-04 11:50:37 +00:00]])
* 批判と課題
[412] [CODE(HTMLe)@en[object]] hack は表面的には問題を解決しましたが、あまり美しい解法ではなく、
“hack” と呼ばれるに留まった上、普及もしませんでした。
** WinIE で表示できない
[413] 普及を最も阻害する原因となったのは [[WinIE]] が [CODE(HTMLe)@en[[[object]]]]
[[要素]]の[[内容]]を正しく[[レンダリング]]できないことでした。 [[WinIE]]
では [CODE(HTMLe)@en[[[object]]]] [[要素]]は事実上 [[ActiveX control]]
専用であり、 [[ActiveX control]] 以外の [CODE(HTMLe)@en[[[object]]]] [[要素]]は壊れているかのように扱い、
[[内容]]は無視していました。普及率の最も高い (考案当時は9割以上を占めた) [[WinIE]] で正しく[[レンダリング]]できないのでは、
所詮机上の空論の域を出ませんでした。
** [CODE(HTMLe)@en[object]] 要素の乱用である
[414] 構文的に [[HTML4]] に[[適合]]するとはいえ、 [[HTML4]] で定義された [CODE(HTMLe)@en[[[object]]]]
[[要素]]の[[意味]]を [CODE(HTMLe)@en[[[object]]]] [[hack]] は逸脱していました。
[415] そもそも [[HTML4]] の定義上[[行内要素]]であったはずの [CODE(HTMLe)@en[[[object]]]]
[[要素]]の[[内容]]として[[ブロック水準要素]]が利用可能であること自体が[[バグ]]であるとも考えられ、
構文的な[[適合性]]のためにそれを流用することは相応しくないとも思われました。
[416] [CITE@en[(X)HTML5 Tracking]]
([TIME[2009-08-23 14:58:43 +09:00]] 版)