冬様もすなる☆日記というもの (2008年7月)

2008年7月21日

クイズ: HTML 中に HTML を埋め込むには? (@17:19 +09:00)

最近、 script 要素を使って、 HTML 文書中にスクリプト処理用の不可視データを埋め込むことが正式に認められるようになりました*1 。これを使うと、別の HTML 文書さえ、

<script type="text/html">
<!DOCTYPE HTML>
...
</script>
のように埋め込めるようになります。

ではここで問題というかクイズというか頭の体操なのですが、これを二重に (入れ子に) 使うことはできるでしょうか。つまり、 script 要素を使って HTML 文書を埋め込んだ HTML 文書を更に別の HTML 文書に script 要素を使って埋め込むことはできるのでしょうか? イメージとしては、

<!DOCTYPE HTML>
<title>1番目の HTML 文書</title>
<script type="text/html">
<!DOCTYPE HTML>
<title>2番目の HTML 文書</title>
<script type="text/html">
<!DOCTYPE HTML>
<title>3番目の HTML 文書</title>
<p>3番目の HTML 文書
</script>
<p>2番目の HTML 文書
</script>
<p>1番目の HTML 文書
のような感じです。ただし、このままでは、最初の </script タグのところで2番目の HTML 文書が終わるとみなされてしまいます。

この問題を解くに当たっての条件は、 (1) JavaScript などの本当のスクリプトを実行しないこと、 (2) 適合 HTML5 文書であること、の2つだけです。でも (2) はここではあまり本質的ではないので気にしなくてもおkです。

ヒント: <script> 開始タグの後では、普通は </script という文字列があると要素を閉じてしまうのですが、例外的に、 <!-- という文字列があると、次の --> という文字列まで、終了タグを認知しません*2

これができたから何かの役に立つということはないでしょうけれども、お暇な方は考えてみてください。

気が向いたら答えを発表します。

三重 (二重埋め込み) ができたら、もう1回入れ子にして、四重 (三重埋め込み) の方法を考えてみてください。もしできないなら、できないことを証明してみてください。

  1. 個人的にはこれは微妙だと思うのですが、それが世間の実態で、大した実害もないのですから、致し方ありますまい。
  2. これもあんまりな仕様だと思うのですが、 Netscape Navigator 2 の昔からそうなってるのでしょうから仕方ありませんね。。。
ご感想 (著者に直接送る)
[これは何?]

2008年7月6日

<base href> & HTMLAnchorElement.href で遊んでみよう (@00:10 +09:00)

相対 URL の取扱いは、歴史的に仕様も二転三転して実装もばらばら、 Web 関連技術の中でもかなりカオスなものの1つです。

残念なことに JavaScript や DOM で相対 URL を解決する API は提供されていないのですが、 a 要素の href DOM 属性は href 内容属性の値 (URL) を解決したものを返すことになっていますので、これと base 要素を組み合わせると、相対 URL を解決したものをスクリプトから取得できます。

これを使って遊んでみようということで、 Live URL Resolution Viewer を作りました。解決させたい相対 URL と基底 URL を指定すると、解決された URL が出てきます。

試しに、基底 URL として mailto:a@b.c#d、解決させる URL として e を指定してみましょう。こんな結果が得られたはずです。

Firefox2
e (基底 URL が階層的な URL ではないので、 HTMLAnchorElement.href が相対 URL をそのまま返しています。)
WinIE7
mailto:a@b.ce (基底 URL にあった素片識別子は除去されます。相対 URL が基底 URL になぜか連結されます。)
Safari3
空文字列 (基底 URL が階層的な URL ではないので、 HTMLAnchorElement.href が空文字列を返しています。)
Opera9
mailto:/e (なぜか / が補われています。)
見事にばらばらです。普通は mailto: URL なんて基底 URL に使わないので実害はないですが。

いろいろな URL を指定して試してみるとわかりますが、どのブラウザでも共通した同じ結果が得られるのは、ごく限られた種類の URL の組み合わせのときだけです。

ご感想 (著者に直接送る)
[これは何?]